我一直在尝试将一个新的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程序集。
然后我使用Nuget将Microsoft.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版本的代码。
答案 0 :(得分:1)
这可能不是最佳解决方案,但它是对评论,原始问题以及我所做研究和测试的建议的总结,以及我对结果的解释。我希望它会有用。感谢所有为解决这个问题做出贡献的人。
TL; DR:在BUILD系统上安装IIS和IIS管理功能,或者在安装这些功能的系统上构建。
此错误表示您的应用程序正在尝试加载Microsoft.Web.Administration
的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包可以解决所有这些问题。