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.0到7.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版本的代码.
这可能不是一个最佳解决方案,但它是评论中的建议、原始问题和我所做的研究和测试以及我对结果的解释的总结。我希望它会有用。感谢所有为解决此问题做出贡献的人。
TL;DR:在您的 BUILD 系统上安装 IIS 和 IIS 管理功能,或者在安装了这些功能的系统上进行构建。
此错误意味着您的应用程序正在尝试加载 IIS Express 版本Microsoft.Web.Administration,这可能不是您在生产服务器上想要的。
(另请参阅/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 次 |
| 最近记录: |