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

Rob*_*ert 12 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.
Run Code Online (Sandbox Code Playgroud)

使用以下信息: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.
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

我已经尝试将绑定重定向添加到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" />
Run Code Online (Sandbox Code Playgroud)

此时它会立即断开,我无法加载任何页面.(似乎比我没有额外的dll时更糟糕.

我看过很多类似的帖子,但似乎无法弄清楚.希望我对Azure缺乏了解会做一些简单的错误.任何帮助将非常感激.

更新的信息

右键单击属性以供参考Microsoft.Web.Administration:

复制本地:真

运行时版本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)
Run Code Online (Sandbox Code Playgroud)

我假设Nuget只提供了版本,7.0.0.0但有些东西认为它需要7.9.0.0.

更新3:成功

我开始研究版本号差异,发现这个堆栈问题解释了IIS和IISExpress之间的一些差异.

现在我改变了从重定向7.9.0.07.0.0.0这似乎解决了这个问题.

<bindingRedirect oldVersion="0.0.0.0-7.9.0.0" newVersion="7.0.0.0" />
Run Code Online (Sandbox Code Playgroud)

程序集现在可以工作,页面都在加载.

这个解决方案虽然感觉非常hacky.是绑定到较低版本的不良做法还是可能导致将来出现问题?我担心我应该解决调用不同IIS版本的代码.

Flo*_*ter 3

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

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

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

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

(另请参阅/sf/answers/785142851/

要使您的应用程序在具有真正 IIS 的生产系统上运行,您必须在Microsoft.Web.Administration安装了 IIS(不仅是 IIS Express)版本的系统上构建它,即您必须安装 IIS 并启用 IIS 管理功能(s)(在不同的 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>
Run Code Online (Sandbox Code Playgroud)

(这是针对 Visual Studio 2012 的,对于较新的版本可能有所不同!)

请注意,如果您关闭SpecificVersion或设置Version为 7.9.0.0,只要您在Microsoft.Web.Administration安装了 IIS 的系统上构建应用程序,您的应用程序仍然可以工作。但是,如果您在缺少 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 包可以解决所有这些问题。


归档时间:

查看次数:

3822 次

最近记录:

8 年,1 月 前