【问题标题】:Could not load file or assembly System.Web.Http.WebHost after published to Azure web site发布到 Azure 网站后无法加载文件或程序集 System.Web.Http.WebHost
【发布时间】:2013-12-17 20:30:54
【问题描述】:

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

无法加载文件或程序集'System.Web.Http.WebHost, 版本=5.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35' 或 它的依赖项之一。定位程序集的清单定义 与程序集引用不匹配。 (HRESULT 的例外情况: 0x80131040)

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

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

来源错误:

在执行过程中产生了一个未处理的异常 当前的网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

装配负载跟踪:以下信息可能有助于 确定为什么程序集 '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>

【问题讨论】:

    标签: asp.net asp.net-mvc visual-studio azure azure-web-app-service


    【解决方案1】:

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

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

    如果您遇到类似的错误,即缺少某些其他程序集,则将该程序集设置为 copylocal=true 并重新部署,如果您不确定它的依赖关系,请反复重复此操作。

    【讨论】:

    • Copy Local 已经是 True。奇怪的是,它显示 Runtime Version 是 v4.0.30319 而不是 v5?
    • 你知道这里发生了什么吗?当它跳起来咬我时,我已经运行了 18 个月。
    • 这解决了我的问题谢谢!但对我来说,我们必须在项目中包含框架库(在我的情况下不是 Azure 而是 IIS 服务器)对我来说似乎很奇怪。有谁知道是否需要运行一些更新,这样我们就不必再包含它们了?
    • 迷你插件,因为我花了很长时间才找到本地副本:在 VS2013 中,您打开项目中的“引用”节点,然后右键单击->您想要的库上的属性设置“复制本地”。
    • 如果 Copy Local 已设置为 true,并且由于依赖关系而无法更新 WebApi,则可以将 Copy Local 设置为 false,构建,然后将 Copy Local 设置回 true 并构建。我不知道为什么会这样。
    【解决方案2】:

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

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

    【讨论】:

    • 请避免仅链接答案.. 而是请在此处发布上述链接中的相关信息..
    • 运行 Update-Package 命令解决了该问题,而其他建议均无效。谢谢你的回答!
    • 问题的最佳解决方案。
    • 完美答案,谢谢!
    • 这个解决方案也对我有用。我很确定这是由 ReSharper 的“删除未使用的程序集”功能引起的。删除未使用的程序集有时会在不检查 NuGet 包内容的情况下盲目删除程序集。
    【解决方案3】:

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

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

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

    【讨论】:

    • 谢谢,这很有帮助。你知道为什么这些文件不只是在 GAC 中吗?是不是因为不同的站点可能使用不同的 dotnet 框架等?
    • 我记得自从微软在该领域应用了关键修复程序(我猜是在 System.Web/ASP NET/MVC 中)后,这个问题就发生了。我猜这些命名空间不在 GAC 中(所以不在本机 NET 程序集中),而是在单独的 Visual Studio 或 MVC 路径中。
    • 这解决了我的 VPS 上的问题(这不仅仅是天蓝色的问题)
    • 这对我有用(尽管我没有使用 Azure)。我正在将一个项目从 .net 4.5 框架环境迁移到 4.0 框架环境,并在一切结束时遇到了这个问题。
    • 根据 DeeArgee 的上述建议,我已经为所有 3 个 dll 设置了 LOCAL COPY = true。但是这个建议最终解决了这个问题:“如果 Copy Local 已经设置为 true,则存在将 Copy Local 设置为 false,构建,然后将 Copy Local 设置回 true 并构建的技巧。我不知道为什么会这样。 – DeeArgee 2015 年 11 月 19 日 17:16
    【解决方案4】:

    对我来说,将以下部分添加到 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包。
    【解决方案5】:

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

    【讨论】:

    • 这是唯一适合我的解决方案。我想那里还有其他一些旧版本的 dll 会出错。谢谢!
    【解决方案6】:

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

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

    【讨论】:

    • 这里也一样,这正是我们所需要的。
    • 可能是因为它与一年前其他几个答案中描述的解决方案相同。
    【解决方案7】:

    我正在使用 vs2012,我认为更新 KB2781514 更改了一些设置。我的 MVC4 项目中的所有 System.Web.Http 都更改为 false 并且我一直收到此消息。我在发布属性中更改了All file in this project,但它不起作用。最后我要一一更改Copy Local = true,解决了这个问题。

    【讨论】:

      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

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

        System.web.http.webhost not found.
        

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

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

        你可以在你的项目bin目录中找到这个文件。

        【讨论】:

          【解决方案10】:

          这发生在我的 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>
          

          【讨论】:

            【解决方案11】:

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

            【讨论】:

              【解决方案12】:

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

              我的解决方案中有多个项目,并且 WebApi Core 已安装在另一个项目中。我通过右键单击并从列表中勾选程序集来引用 System.Web.Http 程序集,它在 Azure 上不起作用,尽管在本地它可以构建。我不得不删除手动引用并将 WebApi Core nuget 包添加到需要程序集引用的每个项目中。

              【讨论】:

                【解决方案13】:

                如果“复制本地”已经为真,我发现如果您删除已发布到的文件并再次发布,它有时会起作用。

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

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

                【讨论】:

                  【解决方案14】:

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

                  【讨论】:

                    【解决方案15】:

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

                    【讨论】:

                      猜你喜欢
                      • 2016-08-07
                      • 1970-01-01
                      • 2014-09-02
                      • 2014-10-22
                      • 2018-11-09
                      • 1970-01-01
                      • 2017-12-23
                      • 2013-01-29
                      • 2017-03-07
                      相关资源
                      最近更新 更多