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

ca9*_*3d9 138 asp.net asp.net-mvc azure visual-studio azure-web-sites

我创建了一个Web项目,它在Visual Studio中运行良好.但是,在将其发布到azurewebsites后,我收到以下错误.什么可能导致这个问题?

无法加载文件或程序集'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"的原因.

警告:装配绑定日志记录已关闭.要启用程序集绑定失败日志记录,请将注册表值[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>
Run Code Online (Sandbox Code Playgroud)

Nav*_*jay 129

dll在发布(部署环境)缺失.这就是为什么它在本地工作,即Visual Studio而不是在Azure网站环境中工作的原因.

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

如果你得到类似的错误,即一些其他程序集缺失,那么将该程序集设置为copylocal = true并重新部署,迭代重复此操作 - 如果您不确定其依赖性.

  • 如果"复制本地"已设置为true,并且由于依赖性而无法更新WebApi,则可以将"将本地复制"设置为false,构建,然后将"复制本地"设置为"true"并进行构建.我不知道为什么会这样. (6认同)
  • 你知道这里发生了什么吗?当我跳起来咬我的时候,我已经运行了18个月. (4认同)
  • `Copy Local`已经是True.奇怪的是它显示`Runtime Version`是v4.0.30319而不是v5? (2认同)
  • 这解决了我的问题谢谢!但是我觉得我们必须在我们的项目中包含框架库(在我的例子中不是Azure而是IIS服务器).有人知道它是否运行一些更新,所以我们不必再包括它们了吗? (2认同)

amr*_*aby 89

如果您仍在寻找答案,请尝试查看此问题主题.它帮助我解决了类似的问题.

编辑:根据Update-Package Microsoft.AspNet.WebApi -reinstallPathoschild的建议,帮助我的解决方案是从NugGet包管理器运行.然后我必须删除我的.suo文件并重新启动VS,正如Sergey Osypchuk在此主题中所建议的那样.

  • 遗憾的是我只能回答一下这个答案. (6认同)
  • 运行Update-Package命令解决了该问题,而其他任何建议均无效.谢谢你的回答! (3认同)
  • 这个解决方案对我也有用.我很确定这是由ReSharper的"删除未使用的程序集"功能引起的.删除未使用的程序集有时会在不检查NuGet包内容的情况下盲目删除程序集. (3认同)

Bro*_*nek 54

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

System.Web.Http.dll
System.Web.Http.WebHost.dll
System.Net.Http.Formatting.dll
Run Code Online (Sandbox Code Playgroud)

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

  • 根据上面 DeeArgee 的建议,我已经为所有 3 个 dll 设置了 LOCAL COPY = true。但这个建议最终解决了问题:“如果 Copy Local 已经设置为 true,则有一个技巧可以将 Copy Local 设置为 false,构建,然后将 Copy Local 设置回 true 并构建。我不知道为什么会这样。 – DeeArgee 2015-11-19 17:16 (2认同)

Ead*_*del 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>
Run Code Online (Sandbox Code Playgroud)

这个例子代表MVC 5.1.希望它能帮助某人解决这个问题.

  • 你太棒了.像mvc5中的魅力一样工作.谢谢 (2认同)
  • 谢谢你,为我工作了+1,问这个问题的人应该把这个标记为答案! (2认同)

Mag*_*lin 14

对我来说,它在发布对话框中的设置下的文件发布选项中选择"删除目的地中的其他文件"后开始工作.


小智 10

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

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


tha*_*anh 6

我正在使用vs2012,我认为更新KB2781514改变了一些设置.我的MVC4项目中的所有System.Web.Http都变为false并且我保持收到此消息.我已经更改了All file in this projectin publish属性,但它无法正常工作.最后,我必须Copy Local = true逐个改变并解决了这个问题.