Azure上的Microsoft.Web.Administration组装错误

时间:2014-11-27 08:38:02

标签: asp.net-mvc azure .net-assembly

我一直在尝试将一个新的asp.net mvc项目部署到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程序集。

然后我使用NugetMicrosoft.Web.Administration添加到项目中。

现在我遇到了一个新错误:

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的属性:

复制本地: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's manifest definition does not match the assembly reference. 
(Exception from HRESULT: 0x80131040)

我从中假设Nuget只提供了版本7.0.0.0,但有些人认为它需要7.9.0.0

更新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版本的代码。

1 个答案:

答案 0 :(得分:1)

这可能不是最佳解决方案,但它是对评论,原始问题以及我所做研究和测试的建议的总结,以及我对结果的解释。我希望它会有用。感谢所有为解决这个问题做出贡献的人。

TL; DR:在BUILD系统上安装IIS和IIS管理功能,或者在安装这些功能的系统上构建。

此错误表示您的应用程序正在尝试加载Microsoft.Web.Administration的IIS Express版本,这可能不是您在生产服务器上所需的版本。

  • 版本7.0.0.0适用于IIS
  • 版本7.9.0.0适用于IIS Express

(另见https://stackoverflow.com/a/11216326/2279059

要使您的应用程序在具有真实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的系统上构建它,那么您的应用程序可能会链接到DLL的IIS Express版本(随Visual Studio一起提供),从而导致问题中描述的问题。因此,您最好指定版本。如果构建系统上没有安装DLL,这将使构建失败,这比产生破坏的可执行文件的“成功”构建更容易调试。

网上还有一个名为Microsoft.Web.Administration的NuGet包。根据较早的信息(https://blog.lextudio.com/2015/05/whats-microsoft-web-administration-and-the-horrible-facts-you-should-know/),这不是Microsoft程序包,不应使用。但是,似乎微软已经取得了该软件包的所有权。虽然我在Visual Studio 2012中无法在NuGet上找到它,但我在Visual Studio 2015中编写的应用程序使用此包并在多个版本的Windows(例如Windows Server 2012和Windows 10,它们具有不同版本的IIS)上正常工作。因此,使用NuGet包可以解决所有这些问题。