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

时间:2013-12-02 07:40:01

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

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

  

无法加载文件或程序集'System.Web.Http.WebHost,   Version = 5.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或   其中一个依赖项。定位程序集的清单定义   与装配参考不匹配。 (HRESULT的例外情况:   0x80131040)

     

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

     

异常详细信息:System.IO.FileLoadException:无法加载文件或   程序集'System.Web.Http.WebHost,Version = 5.0.0.0,Culture = neutral,   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 \微软\融合!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>

14 个答案:

答案 0 :(得分:129)

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

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

如果你得到类似的错误,即某些其他程序集丢失,那么将该程序集设置为copylocal = true并重新部署,如果你不确定它的依赖性,则迭代地重复这个。

答案 1 :(得分:86)

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

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

答案 2 :(得分:53)

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

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

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

答案 3 :(得分:33)

对我来说,工作时将以下部分添加到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。希望它能帮助某人解决这个问题。

答案 4 :(得分:13)

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

答案 5 :(得分:10)

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

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

答案 6 :(得分:6)

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

答案 7 :(得分:2)

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

System.web.http.webhost not found.

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

在此之后它可能会显示相同的错误,但目录名称已更改,可能是system.web.http。按照与上述相同的步骤。它将在上传所有文件后工作。这是由于Visual Studio中的nuget包从互联网上下载但在服务器上无法下载。

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

答案 8 :(得分:1)

在VS2013(Update 5)/ASP.NET 4.5上,在项目类型&#34; Web Application&#34;下发生了这种情况。包括MVC和Web API 2.在创建项目之后和添加任何代码之前发生错误。添加以下配置为我修复了它。解析&#34; System.Web.Helpers&#34;发出两个类似的错误,表现为&#34; System.Web.Mvc&#34;和&#34; System.Web.WebPages&#34;。

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

如果&#34;复制本地&#34;已经是True,如果您删除已发布到的文件并再次发布,我发现它有时会起作用。

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

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

答案 12 :(得分:0)

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

rows = [dict(a=1, b=2, c=3),
        dict(a=4, b=5, c=6)]
df = pd.DataFrame(rows)

答案 13 :(得分:0)

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