Ошибка сборки сборки 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 может решить все эти проблемы.