发布到 Azure 网站后,无法加载文件或程序集 System.Web.Http.WebHost

我创建了一个网络项目,它在视觉工作室运行良好。然而,我得到了以下错误后发布到 Azure 网站。是什么导致了这个问题?

无法加载文件或程序集“ System.Web.Http.WebHost, 版本 = 5.0.0.0,文化 = 中性,PublicKeyToken = 31bf3856ad364e35’或 定位程序集的清单定义 与程序集引用不匹配。(来自 HResult T 的异常: 0x80131040)

说明: 在执行 当前的 Web 请求。请查看堆栈跟踪以获得更多信息 关于错误的信息以及错误在代码中的起源位置。

异常详细信息: System.IO.FileLoadException: 无法加载文件或 程序集‘ System.Web.Http.WebHost,版本 = 5.0.0.0.0,文化 = 中性, PublicKeyToken = 31bf3856ad364e35’或其依赖项之一 找到的程序集的清单定义与该程序集不匹配 (来自 HRESULT T: 0x80131040的异常)

来源错误:

方法执行期间生成未处理的异常 目前的网页要求。关于来源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

程序集负载跟踪: 下列信息可能有助于 确定程序集‘ System.Web.Http.WebHost,Version = 5.0.0.0, 区域性 = 中立,PublicKeyToken = 31bf3856ad364e35’无法加载。

关闭程序集绑定日志记录。启用程序集绑定 故障日志记录,设置注册表值 [ HKLM 软件 Microsoft Fusion! EnableLog ](DWORD)到1 是与程序集绑定失败相关的性能损失 要关闭此功能,请删除注册表值 [ HKLM Software Microsoft Fusion! EnableLog ].

下面是 web.config 文件的一部分。

  <system.web>
<customErrors mode="Off"/>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
<pages>
<namespaces>
<add namespace="System.Web.Helpers" />
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages" />
</namespaces>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers></system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780ccd10d57b246" />
<bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780ccd10d57b246" />
<bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
184175 次浏览

在已发布的(已部署的环境)中缺少 dll。这就是为什么它可以在本地,也就是 Visual Studio 中工作,而不是在 Azure 网站环境中工作的原因。

只需在程序集的属性中执行 Copy Local = true(系统) ,然后进行重新部署,就可以正常工作了。

如果您得到类似的错误,例如缺少其他程序集,那么将该程序集设置为 coplocal = true 并重新部署,迭代地重复此操作——如果您不确定它的依赖关系。

对于我工作添加以下部分到 web.config文件:

<configuration>
...
<runtime>
...
<dependentAssembly>
<assemblyIdentity name="System.Web.Http.WebHost" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.1.0.0" newVersion="5.1.0.0" />
</dependentAssembly>
...
</runtime>
...
</configuration>

本例代表 MVC 5.1,希望对解决此类问题有所帮助。

我正在使用 vs2012,我认为更新 KB2781514改变了一些设置。我所有的系统。韦伯。Http 在我的 MVC4项目改为假,我一直收到这个消息。我已经更改了发布属性中的 All file in this project,但它不起作用。最后,我必须改变 Copy Local = true一个又一个,并解决了这个问题。

在已发布(部署的环境)中缺少 dll。这就是为什么它可以在本地,也就是 Visual Studio 中工作,而不是在 Azure 网站环境中工作的原因。

只需在程序集的属性(System)中执行 CopyLocal = true。韦伯。哈哈。然后进行重新部署,应该可以正常工作。

如果你仍然在寻找答案,试着检查这个 问题线索。它帮助我解决了一个类似的问题。

编辑: 正如 Pathoschild 建议的那样,帮助我的解决方案是从 NugGet 包管理器运行 Update-Package Microsoft.AspNet.WebApi -reinstall。 然后我不得不删除我的.suo 文件并重新启动 VS,正如 Sergey Osypchuk 在 这根线中建议的那样。

我在申请中遇到了同样的问题。

System.web.http.webhost not found.

您只需要从在 VisualStudio 中运行的主项目中复制 system.web.http.webhost文件,并将其粘贴到已发布的项目 bin目录中。

在此之后,它可能会显示相同的错误,但目录名称改变,它可能是 system.web.http。遵循与上面相同的程序。所有文件上传完成后就可以工作了。这是由于在 Visual Studio 中的 nuget 包,他们从互联网上下载,但在服务器上无法下载。

您可以在项目 bin目录中找到此文件。

对我来说,它开始工作后,选择“删除额外的文件在目的地”在文件发布选项设置下的发布对话框。

我遇到了同样的问题,我解决了它通过设置 CopyLocal为真的下列库:

System.Web.Http.dll
System.Web.Http.WebHost.dll
System.Net.Http.Formatting.dll

我必须补充的是,我使用 MVC4和 NET 4

我错过了几个 DLL。即使我在下次发布时手动将它们复制到目录中,它们也会消失。每一个都已经在 VS 中设置为“复制本地”。 对我来说,修复方法是将每个文件设置为 CopyLocalfalse、保存、构建,然后将每个文件设置为 CopyLocaltrue。这次我正确地发布了所有的 DLL。奇怪

如果您的解决方案中有多个项目,并且其中一个项目由于此错误而无法构建,那么请确保您已经在该项目中安装了 WebApi Core nuget 包。只需添加对系统的引用。韦伯。Http 没有帮助,您需要在该项目中安装正确的 nuget 包。

我的解决方案中有多个项目,WebApi Core 已经安装在另一个项目中。我引用了系统。韦伯。通过右键单击并从列表中勾选程序集来组装 Http,它在 Azure 上无法工作,不过在本地构建还可以。我必须删除手动引用,并向每个需要程序集引用的项目添加 WebApi Core nuget 包。

在这种情况下,如果“ CopyLocal”已经为 True,我发现它有时会工作,如果您删除发布它的文件,并再次发布。

例如,如果您正在使用 IIS,请删除网站及其发布到的目录的内容,然后再次发布。

目标文件中可能存在旧版本的文件,因此为了确保不使用旧版本,请在再次发布之前删除所有内容。

在 VS2013(Update 5)/ASP.NET 4.5项目类型“ Web 应用程序”(包括 MVC 和 Web API 2)中,这种情况发生在我身上。错误发生在创建项目之后和添加任何代码之前。添加以下配置为我修复它。解决“系统”后。韦伯。“系统”中出现了另外两个类似的错误。韦伯。Mvc 和 System。韦伯。网页」。

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.2.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>

我得到了同样的错误,我把我的版本从4改成了3,问题解决了:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<!-- Ensure correct version of MVC -->
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
</dependentAssembly>
</assemblyBinding>

我从 web.config 中删除了以下条目,它对我很有用。

<dependentAssembly>
<assemblyIdentity name="System.Web.Http.WebHost" culture="neutral" publicKeyToken="31BF3856AD364E35" />
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="5.2.6.0" />
</dependentAssembly>

确保包版本在整个解决方案中是相等的。我只是降级和升级 Microsoft.AspNet.Mvc软件包的解决方案和问题解决了。

在我的例子中,这个问题可能发生在修改了 nuget 并让它调整了版本之后。

我发现这个系统。Webhost 版本在我的开发文件夹中与在部署文件夹中不同。我只是删除了文件,重新部署了,然后就成功了。

提醒你一下,我还设置了引用“ copy local”,就像其他人在这里说的那样,但是没有用。我不知道最后这是否也是一个帮助因素。