Ошибка сборки сборки Microsoft.Web.Administration на лазурном
Я пытаюсь развернуть новый проект asp.net mvc для Azure для производства. Все работает локально, но при развертывании у меня возникают проблемы с сборками.
При навигации по большинству страниц я начал получать ошибку:
Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
Используя информацию из: qaru.site/info/25534/... Я поймал исключение:
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 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
:
Копировать локально: True
Версия выполнения v2.0.50727
Версия: 7.0.0.0
Вызов сборки: Microsoft.WebMatrix.Core, Version = 8.1.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35
Обновление 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 manifest definition does not match the assembly reference.
(Exception from HRESULT: 0x80131040)
Я предполагаю, что Nuget предоставил только версию 7.0.0.0
, но что-то думает, что ей нужно 7.9.0.0
.
Обновление 3: Успех
Я начал изучать различия номера версии и нашел этот вопрос stack, который объясняет некоторые различия между 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.
Ответы
Ответ 1
Это не может быть оптимальным решением, но это резюме предложений из комментариев, исходного вопроса и исследований и испытаний, которые я сделал, а также мою интерпретацию результатов. Надеюсь, это будет полезно. Спасибо всем, кто внес свой вклад в решение этого вопроса.
TL; DR: установите функции управления IIS и IIS в вашей системе BUILD или создайте систему, в которой они установлены.
Эта ошибка означает, что ваше приложение пытается загрузить версию IIS Express Microsoft.Web.Administration
, которая, вероятно, не является тем, что вы хотите на рабочем сервере.
- Версия 7.0.0.0 предназначена для IIS
- Версия 7.9.0.0 предназначена для IIS Express
(см. также fooobar.com/info/480942/...)
Чтобы ваше приложение работало в производственной системе с реальным IIS, вы должны создать его в системе, где установлена версия Microsoft.Web.Administration
IIS (не только IIS Express), т.е. вам необходимо установить IIS и включить функции управления IIS (которые имеют несколько разные имена в разных версиях/выпусках Windows), поэтому 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 может решить все эти проблемы.