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


141

我创建了一个Web项目,它在Visual Studio中运行良好。但是,将其发布到azurewebsites后出现以下错误。是什么原因引起的?

无法加载文件或程序集'System.Web.Http.WebHost,版本= 5.0.0.0,区域性=中性,PublicKeyToken = 31bf3856ad364e35'或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(来自HRESULT的异常:0x80131040)

说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中起源的更多信息。

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

源错误:

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

程序集加载跟踪:以下信息有助于确定为什么无法加载程序集'System.Web.Http.WebHost,版本= 5.0.0.0,文化=中性,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>

Answers:


129

dll在发布(部署环境)缺失。这就是它在本地(即Visual Studio)而不在Azure网站环境中运行的原因。

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

如果您收到类似的错误(即缺少其他一些程序集),则将该程序集设置为copylocal = true并重新部署,如果不确定其依赖项,则重复进行此操作。


2
Copy Local已经是真的。奇怪的Runtime Version是,它显示的是v4.0.30319而不是v5?
ca9163d9

4
你知道这里发生了什么吗?当我跳起来咬我时,我已经运转了18个月了。
Glenn Gordon

2
这为我解决了问题,谢谢!但是对我来说,我们必须在项目中包含框架库对我来说似乎很奇怪(在我的情况下不是Azure,而是IIS服务器)。有人知道是否需要运行一些更新,这样我们就不必再包含它们了吗?
edgarpetrauskas 2014年

1
迷你加载项,因为它使我永远无法找到本地复制:在VS2013中,您打开了项目中的“引用”节点,然后右键单击要在其上设置“本地复制”的库上的属性。
ArtHare

6
如果“本地复制”已设置为true,并且由于依赖关系而无法更新WebApi,则可以使用技巧将“本地复制”设置为false,然后将“本地复制”设置为true并进行构建。我不知道为什么这样。
DeeArgee 2015年

90

如果您仍在寻找答案,请尝试检查此问题线程。它帮助我解决了类似的问题。

编辑:帮助我的解决方案是Update-Package Microsoft.AspNet.WebApi -reinstall按照Pathoschild的建议,从NugGet软件包管理器运行。然后,我不得不删除我的文件名为.suo并重新启动VS,由谢尔盖Osypchuk建议在此线程


请避免链接只有在这里回答..从上面的链接,而请邮寄相关资料...
Anvesh Yalamarthy

3
运行Update-Package命令解决了该问题,而其他建议均无效。谢谢您的回答!
DigiOz Multimedia 2015年

最好的解决方案。
Festim Cahani

完美的答案,谢谢!
Apolo

3
这个解决方案也对我有用。我相当确定这是由ReSharper的“删除未使用的程序集”功能引起的。删除未使用的程序集有时会盲目删除程序集,而不检查NuGet软件包的内容。
乔·金

54

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

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

我必须补充一点,我使用MVC4和NET 4


谢谢你,这是有帮助的。您知道为什么这些文件不仅仅存在于GAC中吗?是否因为不同的站点可能使用不同的dotnet框架等?
dellyjm 2015年

我记得自从Microsoft在该领域应用关键修复程序以来就发生了这个问题(我猜是在System.Web / ASP NET / MVC中)。我猜这些名称空间不在GAC中(因此不在本机NET程序集中),而是在单独的Visual Studio或MVC路径中。
Bronek 2015年

这解决了我的VPS上的问题(这不仅是天蓝色的问题)
Evilripper

这对我有用(尽管我没有使用Azure)。我将一个项目从.net 4.5框架环境迁移到了4.0,然后在所有问题解决之初就解决了这个问题。
TheQ

1
根据以上DeeArgee的建议,对于所有这3个dll,我已经具有LOCAL COPY = true。但是这个建议最终解决了这个问题:“如果已经将Copy Local设置为true,则存在一种技巧,将Copy Local设置为false,然后构建,然后将Copy Local重新设置为true并构建。我不知道为什么这样做。 – DeeArgee 2015年11月19日在17:16
Debbie A

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。希望它能帮助某人解决此类问题。


2
你真棒。在mvc5中像灵符一样工作。谢谢
DavidGraça2014年

2
谢谢,我也为我工作了+1,提出这个问题的人应该将此标记为答案!
2014年

或者只是Microsoft.AspNet.WebApi.WebHost通过nuget 添加软件包。
Optimax

15

对我来说,它在发布对话框上的设置下的文件发布选项中选择“在目标位置删除其他文件”后开始工作。


为我工作!好一个。
Schizo博士

这是唯一对我有用的解决方案。我猜那里还有其他一些旧版本的dll绊倒了。谢谢!
Ohad Schneider

10

该dll在发布(部署的环境)中丢失。这就是它在本地(即Visual Studio)而不在Azure网站环境中运行的原因。

只需在Assembly(System.Web.Http.WebHost)的属性中执行Copy Local = true,然后进行重新部署,就可以正常工作。


同样在这里,这正是需要的。
pabloelustondo 2015年

1
可能是因为它的解决方案与一年前其他几个答案中所述的解决方案相同。
乍得

6

我正在使用vs2012,我认为更新KB2781514更改了某些设置。我在MVC4项目中所有的System.Web.Http都更改为false,我一直收到此消息。我已更改了All file in this project发布中的属性,但无法正常工作。最后,我必须Copy Local = true一个接一个地解决这个问题。


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>

2

我的应用程序中有同样的问题。

System.web.http.webhost not found.

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

此后,它可能会显示相同的错误,但目录名称可能已更改system.web.http。遵循与上述相同的步骤。上传所有文件后,它将起作用。这是由于Visual Studio中的nuget包,他们可以从Internet下载,但是在服务器上无法下载。

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


1

这是我在VS2013(Update 5)/ASP.NET 4.5上在项目类型“ Web应用程序”下发生的,该项目类型包括MVC和Web API2。在创建项目之后和添加任何代码之前就发生了错误。添加以下配置为我修复了它。解决“ 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>

0

我缺少几个DLL。即使我在下次发布时将它们手动复制到目录中,它们也会消失。在VS中,每个都已设置为“本地复制”。对我来说,解决方法是将每个副本设置为“本地复制”,然后保存,构建,然后将每个副本设置为“本地复制”。这次我发布所有正确发布的DLL时。奇怪


0

如果您的解决方案中有多个项目,并且其中一个项目由于该错误而无法构建,那么请确保已在该项目中安装了WebApi Core nuget软件包。简单地添加对System.Web.Http的引用无济于事,您需要在该项目中安装正确的nuget包。

我的解决方案中有多个项目,而WebApi Core已安装在另一个项目中。我通过右键单击列表中的程序集并引用了它,从而引用了System.Web.Http程序集,尽管它在本地可以正常运行,但它在Azure上不起作用。我必须删除手动参考,并将WebApi Core nuget包添加到需要程序集参考的每个项目中。


0

如果“复制本地”已经为True,那么如果您删除了已发布的文件并再次发布,我发现它有时可以工作。

例如,如果您使用的是IIS,则删除网站及其发布到的目录的内容,然后重新发布。

在目标位置可能有较旧版本的文件,因此,为确保您未使用较旧版本,请在重新发布之前删除所有内容。


0

我从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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.