2014-10-21 6 views
3

После обновления пакета mvc nuget с версии 5.1.0 до 5.2.2 наша машина (webrole) на Azure отказывается запускать веб-роль. Это было в состоянии утилизации. Я нашел ошибку в журнале событий:Asp.net MVC 5.2.2 на Azure

The description for Event ID 1007 from source Windows Azure Runtime 2.4.0.0 cannot be found. Either the component that raises this event is not installed on your local computer or the installation is corrupted. You can install or repair the component on the local computer. 

If the event originated on another computer, the display information had to be saved with the event. 

The following information was included with the event: 

820 
WaIISHost 
Role entrypoint could not be created: 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=5.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) 
File name: 'System.Web.Mvc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 

WRN: Assembly binding logging is turned OFF. 
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1. 
Note: There is some performance penalty associated with assembly bind failure logging. 
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog]. 

---> 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) 
the message resource is present but the message is not found in the string/message table 

Я попытался выполнить поиск через Интернет, но без полезного ответа. Я не смог его решить иначе, как понизить. К счастью, версия пакета 5.1.1 работает.

Update 1: После нескольких проб и ошибок я нашел, что ASP.NET MVC пакеты ОК до версии 5.1.3 Похоже, пакеты с 5.2.0 вверх не поддерживаются.

Обновление 2: Мы решили разбить наш веб-сайт и web.api, так что у меня больше не было этой проблемы. Мое лучшее предположение, что был действительно nuget, который ссылался на старый пакет asp.net mvc.

+0

DO скопировать новый MVC DLL к вашей папке бин приложений? – TomTom

+0

@TomTom Я предполагаю, что это автоматически выполняется путем обновления пакета nuget. Я проверил это во время моего расследования, а Copy Local - True. –

ответ

4

У меня была аналогичная проблема. Мы унаследовали проект и обновили версию ASPNET MVC до 5.2.2.0. Мы не смогли развернуть Azure. Единственная ошибка, которую мы могли найти, - это та, которую вы упомянули здесь.

Мы скорректировали каждый файл web.config, поэтому более старые версии были перенаправлены на более новую версию, но у нас по-прежнему была та же проблема.

Затем мы написали небольшой тестовый метод, который повторялся через каждую сборку, и мы увидели, что один пакет NuGet по-прежнему использует Asp.net MVC 4.0. Этот пакет был старой версией и не обновлялся некоторое время. Я загрузил источник, обновил Mvc Nuget и вручную вставил dll.

Мы развернулись снова, и все прошло безупречно.

Здесь приведены методы испытаний.

private void TestAssemblies() 
    { 
     var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); 
     foreach (Assembly item in allAssemblies) 
     { 
      PrintAssembly(item); 
     } 
    } 
    private void PrintAssembly(Assembly assembly) 
    { 
     foreach (var item in assembly.GetReferencedAssemblies()) 
     { 
      if (item.FullName.Contains("System.Web.Mvc")) 
      { 

       Debug.WriteLine(item); 
       Debug.WriteLine("Parent: " + assembly.FullName); 
       Debug.WriteLine("------------------------------------------------------------"); 
      } 
     } 
    } 
+0

Очень, очень полезно - получилось, что загруженный пакет nuget ссылался на версию 4.0.0, я считаю, что это приводило к ошибке 5.2.2. Никогда бы не узнал об этом, если бы не вышеупомянутый метод испытаний. – g18c

1

Из-за внешнего вида похоже, что вам не хватает переадресации на MVC 5.2.2 в вашем web.config. Это должно сработать.

Мы работаем над проверкой этого сценария. Но дайте нам знать, если это сработает для вас. В вашем web.config пожалуйста, смотрите на следующем разделе, и делает, что он соответствует этим XML ниже:

<dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-5.2.2.0" newVersion="5.2.2.0" /> </dependentAssembly>

+0

У меня есть этот раздел в файле web.config ' <имя assemblyIdentity = "System.Web.Mvc" PublicKeyToken = "31bf3856ad364e35"/> ' , но все же мой webrole перерабатывается. Если это поможет, его местоположение - Западная Европа. –

+0

У меня была аналогичная проблема пару дней назад. Пожалуйста, обратитесь к этому сообщению. Вам нужно добавить раздел в файл WaIISHost.exe.config, который обычно является «E: \ base \ x64» на вашей виртуальной машине. – user2243747

2

MVC 5.2.2 работает прекрасно в лазури. Ваша репликация роли скорее всего является признаком того, что либо вы неправильно разместили ваше приложение должным образом, либо имеете скрытую зависимость от более старой версии MVC, которую может не обрабатывать переадресация привязки.

Я бы настоятельно рекомендовал вам прочитать все записи в great series on trouble shooting Azure deployments Кевина Уильямсона.

Есть тонна вещей, которые может пойти не так, вместо того, чтобы пытаться создать общий список всех размеров, просмотреть записи в блогах, а затем опубликовать комментарий, если вы не можете понять что конкретно происходит.

С учетом ошибки, которую вы опубликовали, если у вас есть правильная переадресация ссылок, о которой упоминает @Yishai Galatzer, у вас может быть DLL в вашем развертывании, которая имеет скрытую зависимость от MVC 5.1.0.0. Я бы предложил использовать такую ​​программу, как Jetbrains DotPeek, чтобы проверить все ваши DLL-файлы в вашем пакете и посмотреть их ссылки. Я подозреваю, что вы найдете тот, который сам зависит от 5.1.0.0.

+2

«Ваша репликация роли скорее всего является признаком того, что вы неправильно правильно развернули ваше приложение» - нет, это указывает на то, что WebRoles и WorkerRoles часто являются огромной болью из-за этой проблемы конфликтов DLL, что приводит к критическому сбою развертывания , и без какой-либо полезной информации о том, почему. Это просто неприемлемо, так было так долго. После еще одного 24-часового периода боли, подобного этому 1 неделю назад, я, наконец, перешел на сайт на лазурном фоне, и тот же код был установлен без проблем. –

+0

@ Николас :) Это показатель того, что Лазур - огромная боль в заднице. Это не должно быть так сложно. Я потратил целый день на эту проблему. – KingOfHypocrites

+0

@DavidPeden На самом деле, я бы не рекомендовал Jetbrains DotPeek для этой задачи, так как он не отображает все ссылки (кажется, он скрывает ссылочные сборки, которые он не может найти). Я потратил много времени, пока не перепроверку зависимостей в другом дизассемблере (простое декомпилирование Telerik), чтобы узнать «Microsoft.Azure.WebJobs.Host, Version = 1.0.1.0' ссылки» Microsoft.WindowsAzure.Storage, Version = 4.0.1.0 ' – eXavier

0

У меня была аналогичная проблема пару дней назад. См. Сообщение this. Вам нужно добавить <dependentAssembly> раздел в WaIISHost.exe.config который обычно @'E: \ base \ x64' на вашей виртуальной машине.

2
I have also face similar problem with mvc5.2.2 azure deployment.. 

окончательное решение, нам нужно добавить этот Web.config

<dependentAssembly> 
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
    <bindingRedirect oldVersion="1.0.0.0-5.2.2.0" newVersion="5.2.2.0" /> 
</dependentAssembly>`` 
0

Много раз я нашел проблему, чтобы быть в ~ \ Views \ файл Web.config. Он содержит ссылку на старую версию MVC. Просто обновите его вручную.

Если это не работает, выполните полный текстовый поиск вашего решения в Sublime Text или каком-либо другом инструменте вне VS и найдите строку версии, вызывающую проблемы.

0

У меня была такая же проблема, когда она работала нормально на моей машине Dev, но когда она была развернута, я получал ошибку сборки. Чтобы решить эту проблему, я должен был изменить «oldVersion» с версии 0.0.0.0 до версии 1.0.0.0

<dependentAssembly> 
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
    <bindingRedirect oldVersion="0.0.0.0-5.2.2.0" newVersion="5.2.2.0" /> 
</dependentAssembly> 

Для

<dependentAssembly> 
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
    <bindingRedirect oldVersion="1.0.0.0-5.2.2.0" newVersion="5.2.2.0" /> 
</dependentAssembly> 
Смежные вопросы