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

147

我创建了一个 web 项目,并在 Visual Studio 中运行良好。然而,在将其发布到 Azure 网站后,我遇到了以下错误。这可能是什么原因造成的?

无法加载文件或程序集“System.Web.Http.WebHost, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或其某一个依赖项。 找到的程序集清单定义与程序集引用不匹配。 (HRESULT 的异常 来自0x80131040)

描述: 执行当前 Web 请求期间,出现未经处理的异常。请查看堆 栈跟踪以获取有关错误以及代码中起源位置的更多信息。

异常详细信息: System.IO.FileLoadException: 无法加载文件或程序集 “System.Web.Http.WebHost, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或其某一个依赖项。找到的程序集 清单定义与程序集引用不匹配。 (HRESULT 的异常来自 0x80131040)

源错误:

执行当前 Web 请求期间生成了未经处理的异常。可以使用下面的 异常堆栈跟踪识别异常的来源和位置。

程序集加载跟踪: 下面的信息可以帮助确定无法加载程序集 “System.Web.Http.WebHost, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”的原因。

WRN: 程序集绑定日志记录已关闭。要启用程序集绑定故障记录,请将 注册表值 [HKLM\Software\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>
16个回答

131
dll文件在发布(部署)环境中丢失。这就是为什么它在本地即Visual Studio中工作,但在Azure网站环境中无法正常工作的原因。
只需在程序集(System.Web.Http.WebHost)的属性中将Copy Local = true,然后重新部署即可正常工作。
如果你遇到类似的错误,比如缺少其他程序集,则需要将该程序集设置为copylocal=true 并重新部署,在确认其依赖关系之前,可以重复此操作。

2
Copy Local已经为真。奇怪的是,它显示的“运行时版本”是v4.0.30319而不是v5? - ca9163d9
4
你知道这里发生了什么吗?我运行良好已经18个月了,但突然出了问题。 - Glenn Gordon
2
这对我解决了问题,谢谢!但是我觉得很奇怪,我们必须在项目中包含框架库(在我的情况下不是 Azure 而是 IIS 服务器)。有人知道是否需要运行一些更新以便不再需要包含它们吗? - edgarpetrauskas
1
迷你附加组件,因为我花了很长时间才找到“复制本地”:在VS2013中,您打开项目中的“引用”节点,并右键单击要设置“复制本地”的库->属性。 - ArtHare
6
如果“Copy Local”已设置为true,并且由于依赖项而无法更新WebApi,有一个技巧可以将“Copy Local”设置为false,构建项目,然后再将“Copy Local”设置为true并重新构建。我不知道这个方法为什么有效。 - DeeArgee
显示剩余6条评论

93
如果您仍在寻找答案,请尝试查看此问题线程。 它帮助我解决了类似的问题。
编辑: 帮助我的解决方案是从NugGet包管理器运行Update-Package Microsoft.AspNet.WebApi -reinstall,如Pathoschild所建议。 然后,我不得不删除我的.suo文件并重新启动VS,如Sergey Osypchuk在此线程中建议的那样。

3
运行Update-Package命令解决了问题,而其他建议都没有起作用。谢谢您的答案! - DigiOz Multimedia
问题的最佳解决方案。 - Festim Cahani
完美的答案,谢谢! - Apolo
我认为在大多数情况下,Naveen 给出了正确的答案。但是在我的情况下,我没有拉取 packages 文件夹的解决方案,当我从 packages.conf 重新安装 nuget 命令时,它可能已经改变了 dll 的获取方式。所有其他的 dll 都没问题,但这一个特别指向了 .net 文件夹。 - Mungoid
3
这个解决方案对我也起作用了。我相当确定这是由于ReSharper的“删除未使用程序集”功能造成的。该功能有时会盲目地删除程序集,而没有检查NuGet包内容。 - Joseph King
显示剩余4条评论

56

我遇到了同样的问题,通过将以下库的CopyLocal设置为true来解决了它:

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

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


谢谢,这很有帮助。您知道为什么这些文件不会直接放在GAC中吗?是因为不同的站点可能使用不同的.NET框架等吗? - dellyjm
据我记得,自从微软在 System.Web/ASP NET/MVC 领域应用了关键修复补丁以来,这个问题就一直存在。我猜测这些命名空间不在 GAC 中(因此不在本机 NET 组件中),而是在单独的 Visual Studio 或 MVC 路径中。 - Bronek
这解决了我VPS上的问题(这不仅是Azure的问题) - Evilripper
这对我有用(虽然我没有使用Azure)。我把一个项目从 .net 4.5 框架环境移动到了一个 4.0 环境,并在一切结束时遇到了这个问题。 - TheQ
2
根据DeeArgee上面的建议,我已经为这3个dll设置了LOCAL COPY = true。但是这个建议最终解决了问题:“如果Copy Local已经设置为true,那么有一个技巧可以将Copy Local设置为false,构建,然后将Copy Local重新设置为true并构建。我不知道为什么这样做会起作用。”- DeeArgee Nov 19 '15 at 17:16 - Debbie A
这对我有用,但我还必须添加 Newtonsoft.JsonLocalization - Serj Sagan

34

对我来说,解决方法是在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。希望它能帮助某些人解决这样的问题。


或者只需通过NuGet添加Microsoft.AspNet.WebApi.WebHost包。 - Optimax

17

对于我而言,在发布对话框的设置下,选择“删除目的地处的附加文件”后,它开始工作。


这是我在这里找到的唯一解决方案。我猜那里可能有其他旧版本的dll文件导致了问题。谢谢! - Ohad Schneider

10

发布环境中缺少dll文件,这就是为什么在本地即Visual Studio中可以运行但在Azure网站环境中不能运行的原因。

只需在程序集(System.Web.Http.WebHost)的属性中设置Copy Local = true,然后重新部署,它应该能正常工作。


同样的情况在这里,这正是所需之物。 - pabloelustondo
1
可能是因为这个解决方案在一年前的其他答案中已经被描述过了。 - Chad

6

我正在使用vs2012,我认为更新KB2781514更改了一些设置。 我MVC4项目中的所有System.Web.Http都变成了false,并且我一直收到此消息。 我已经在发布属性中更改了此项目中的所有文件,但它不起作用。 最后,我不得不逐个更改复制本地 = true,并解决了这个问题。


2

我在我的应用程序中也遇到了同样的问题。

System.web.http.webhost not found.

您只需从您在Visual Studio中运行的主项目中复制system.web.http.webhost文件,并将其粘贴到您发布的项目的bin目录中。这样可能会显示相同的错误,但目录名称已更改,它可能是system.web.http。按照上述相同的过程进行操作。在上传所有文件后,它将正常工作。这是由于Visual Studio中nuget包从Internet下载,但在服务器上无法下载。您可以在项目的bin目录中找到此文件。

2

我遇到了同样的错误,将版本从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>

1
这件事发生在我使用VS2013(更新5)/ASP.NET 4.5的"Web应用程序"项目类型中,其中包括MVC和Web API 2。错误发生在创建项目后,尚未添加任何代码之前。添加以下配置修复了我的问题。解决了"System.Web.Helpers"问题后,又出现了两个类似的错误:"System.Web.Mvc"和"System.Web.WebPages"。
<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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接