Подтвердить что ты не робот

Неправильная переадресация на сборку

Я пытаюсь развернуть тестовое веб-приложение на Azure, но когда я запускаю эмулятор Azure на своем локальном компьютере, я получаю эту ошибку с консоли эмулятора Azure, прикрепленной к моему WebRole:

System.TypeLoadException: Unable to load the role entry point due to the following     exceptions:
-- System.IO.FileLoadException: Could not load file or assembly 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

=== Pre-bind state information ===
LOG: User = COLLAB\mirko.lugano
LOG: DisplayName = System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
(Fully-specified)
LOG: Appbase = file:///C:/Code/Application/<MyWebProject>.Azure/csx/Debug/roles/<MyWebProject>/approot/bin
LOG: Initial PrivatePath = C:\Code\Application\<MyWebProject>.Azure\csx\Debug\roles\<MyWebProject>\approot\bin
Calling assembly : ActionMailer.Net.Mvc, Version=0.7.4.0, Culture=neutral, PublicKeyToken=e62db3114c02a1c2.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Code\Application\<MyWebProject>.Azure\csx\Debug\roles\<MyWebProject>\base\x64\WaIISHost.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
LOG: Attempting download of new URL file:///C:/Code/Application/<MyWebProject>.Azure/csx/Debug/roles/<MyWebProject>/approot/bin/System.Web.Mvc.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

---> System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
  at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
  at System.Reflection.RuntimeModule.GetTypes()
  at System.Reflection.Assembly.GetTypes()
  at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetRoleEntryPoint(Assembly entryPointAssembly)
  --- End of inner exception stack trace ---
  at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetRoleEntryPoint(Assembly entryPointAssembly)
  at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.CreateRoleEntryPoint(RoleType roleTypeEnum)
  at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(RoleType roleTypeEnum)
[fabric] Role state Unknown

Все работало нормально, пока у меня был MVC3, установленный на моей локальной машине (сборка MVC3 была в GAC), но поскольку я удалил MVC3 (у Azure не установлен MVC), я получаю эту ошибку. В моем веб-приложении регулярно включен MVC4, и это отлично работает. Я тогда подумал о перенаправлении привязки сборки, и я заметил, что в моем файле web.config у меня уже есть:

  <runtime>    
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">      
    ...
    <dependentAssembly>        
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
    ...
  </assemblyBinding>
</runtime>

который должен быть уже правильным, согласно документации, которую я прочитал в Интернете. Я также попытался установить свойство SpecificVersion моего System.Web.Mvc.dll (версия 4.0.0.0) на false, но безрезультатно. Я что-то упускаю? Не следует ли автоматически переадресовывать вызывающую сборку ActionMailer.Net.Mvc на правильную версию сборки MVC? Любые идеи приветствуются. Спасибо.

4b9b3361

Ответ 1

В Azure WebRoles по умолчанию (в режиме Full IIS) RoleEntryPoint получает стеной от остальной части WebRole и работает в другом процессе.

Побочным эффектом этого является то, что ваш RoleEntryPoint не будет иметь доступ к вашему web.config.

  • Azure SDK 1.3 -1.7 будет выглядеть в WaIISHost.exe.config

  • Azure SDK 1.8+ будет выглядеть в WebRoleProjectName.dll.config.

С новым изменением SDK вы сможете разместить app.config в своем проекте, и ваша точка входа роли должна иметь к нему доступ.

Подробнее об этом читайте в этом сообщении в блоге или в этом PostyStackflow post

Ответ 2

Спасибо Руне за драгоценный намек. Это не решило мою проблему, но указало на правильное направление, потому что у меня установлена ​​последняя версия Azure SDK (1.8), и этот трюк WaIISHost.exe.config больше не работает в последней версии Azure. ЗДЕСЬ сказано, что я только что сказал, и решение, которое сработало для меня, которое должно переименовать файл WaIISHost.exe.config в MyWebAppName.dll.config(поместив его на тот же уровень вашего файла web.config в вашем веб-приложении и установка его Копировать для вывода свойства Directory в "Копировать всегда". Конечно, этот файл конфигурации содержит раздел перенаправления привязки, как описано выше.

Ответ 3

На сегодняшний день с последним SDK WebRoleProjectName.dll.config будет автоматически сгенерирован для вас с содержимым Web.config и скопирован в выходной каталог.

Однако это не будет автоматически включено в пакет развертывания! Для этого вам нужно использовать своеобразное хакерское решение: включить сгенерированный файл в проект, выбрав "показать все файлы", а затем включить именно этот файл. Результирующее изменение в csproj должно выглядеть так (не, не выбирайте его как "Копировать всегда"!):

<Content Include="bin\WebRoleProjectName.dll.config" />