2014-11-27 3 views
10

Я пытаюсь развернуть новый проект asp.net mvc для Azure для производства. Все работает локально, но при развертывании у меня возникают проблемы с сборками.Ошибка сборки сборки Microsoft.Web.Administration на azure

При навигации к большинству страниц, я начал получать ошибку:

Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information. 

Используя информацию из: https://stackoverflow.com/a/8824250/1411764 Я поймал исключение:

Could not load file or assembly 'Microsoft.Web.Administration, 
Version=7.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or 
one of its dependencies. The system cannot find the file specified. 

Microsoft.Web.Administration-видимому, является узел IIS.

Я затем добавил Microsoft.Web.Administration к проекту с использованием Nuget.

Теперь я застрял с новой ошибкой:

Could not load file or assembly 'Microsoft.Web.Administration' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) 

Я попытался добавить привязку перенаправления в web.config

<dependentAssembly> 
    <assemblyIdentity name="Microsoft.Web.Administration" publicKeyToken="31BF3856AD364E35" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-7.9.0.0" newVersion="7.9.0.0" /> 

На данный момент она ломает сразу и я не могу загрузить какую-либо страницу. (Кажется, хуже, чем когда у меня не было дополнительной dll.

Я читал много похожих сообщений, но, похоже, не могу понять. Надеюсь, я делаю что-то простое из-за непонимания в отношении Azure . Любая помощь будет высоко ценится

Обновлено информация

Щелчок правой кнопкой мыши свойства для справки Microsoft.Web.Administration:.

Copy Local: True

Продолжительность Версия v2.0.50727

Версия: 7.0.0.0

Вызов сборки: Microsoft.WebMatrix.Core, Version = 8.1.0.0, культура = нейтральной, PublicKeyToken = 31bf3856ad364e35

Update 2 - от комментарии:

После установки привязки к 7.0.0.0 он теперь снова компилируется на сервере и может отображать некоторые страницы, но я все еще поймал предыдущую ошибку.

Could not load file or assembly 'Microsoft.Web.Administration, Version=7.9.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) 

Я полагаю, что из этого NuGet только поставляемой версии 7.0.0.0 однако что-то думает, что нуждается в 7.9.0.0.

Update 3: Успех

Я начал искать в номер версии различий и нашел этот stack question, который объясняет некоторые различия между IIS и IISExpress.

На данный момент я сменил перенаправление с 7.9.0.0 на 7.0.0.0, который, похоже, решил проблему.

<bindingRedirect oldVersion="0.0.0.0-7.9.0.0" newVersion="7.0.0.0" /> 

Сборка теперь работает, и страницы загружаются.

Это решение кажется очень взломанным. Является ли привязка к плохой практике более низкой версии или может вызвать проблемы в будущем? Я обеспокоен тем, что мне следует обратиться к коду, вызывающему разные версии IIS.

+0

Является ли это веб-ролью или веб-сайтом? – haim770

+0

Вы можете проверить FileInfo для этой Microsoft.Web.Administration.dll и добавить AssemblyInfo и версию файла DLL, я подозреваю, что они могут не соответствовать 100%. –

+0

Попробуйте включить журнал Fusion, чтобы получить больше информации о проблемах с точной привязкой. Http://stackoverflow.com/questions/4679279/debug-net-assembly-binding-aka-find-what-dll-is-used-and-why –

ответ

0

Это не может быть оптимальным решением, но это резюме предложений из комментариев, исходного вопроса и исследований и испытаний, которые я сделал, а также моей интерпретации результатов. Надеюсь, это будет полезно. Спасибо всем, кто внес свой вклад в решение этого.

TL; DR: Установить функции управления IIS и IIS в вашей системе BUILD или построить систему, в которой они установлены.

Эта ошибка означает, что ваше приложение пытается загрузить версию IIS Express Microsoft.Web.Administration, что, вероятно, не так, как вы хотите на производственном сервере.

  • Версия 7.0.0.0 для IIS
  • версии 7.9.0.0 для IIS Express

(смотри также https://stackoverflow.com/a/11216326/2279059)

Чтобы сделать вашу работу приложения в производственной системе с реальный IIS, вы должны создать его в системе, где установлена ​​версия IIS (не только IIS Express) Microsoft.Web.Administration, т. е. вам необходимо установить IIS и включить функции (ы) управления IIS (которые имеют несколько разные имена на разные Windo ws версий/выпусков), поэтому существует C:\Windows\system32\inetsrv\Microsoft.Web.Administration.DLL.

В файле проекта, ссылка на DLL должна выглядеть следующим образом:

<Reference Include="Microsoft.Web.Administration, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> 
    <HintPath>C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll</HintPath> 
    <SpecificVersion>True</SpecificVersion> 
</Reference> 

(! Это для Visual Studio 2012 и может отличаться от более новых версий)

Обратите внимание, что если вы выключите SpecificVersion или установите Version на 7.9.0.0, ваше приложение все равно будет работать, если вы его создадите в системе, где установлены IIS и Microsoft.Web.Administration. Однако, если вы создадите его в системе, где отсутствует DLL, ваше приложение может быть связано с версией библиотеки IIS Express DLL (которая поставляется с Visual Studio), что вызывает проблему, описанную в вопросе. Поэтому вам лучше указать версию. Это приведет к сбою сборки, если DLL не будет установлена ​​в системе сборки, которая легче отлаживается, чем «успешная» сборка, которая создает сломанный исполняемый файл.

Существует также пакет NuGet под названием Microsoft.Web.Administration в Интернете. Согласно более старой информации (https://blog.lextudio.com/2015/05/whats-microsoft-web-administration-and-the-horrible-facts-you-should-know/), это не пакет Microsoft и не должен использоваться. Однако, похоже, Microsoft теперь взяла на себя ответственность за пакет. Хотя я не мог найти его на NuGet в Visual Studio 2012, приложение, которое я написал в Visual Studio 2015, использует этот пакет и отлично работает на нескольких версиях Windows (таких как Windows Server 2012 и Windows 10, которые имеют разные версии IIS). Поэтому использование пакета NuGet может решить все эти проблемы.

Смежные вопросы