我创建了一个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>
13 回答
我遇到了同样的问题,我通过将
CopyLocal
设置为true来解决以下问题:我必须补充一点,我使用MVC4和NET 4
发布的(已部署的环境)中缺少
dll
. 这就是为什么它在本地工作,即Visual Studio而不是在Azure网站环境中工作的原因 .只需在程序集的属性中执行
Copy Local = true
( System.Web.Http.WebHost ),然后进行重新部署,它应该可以正常工作 .如果你得到类似的错误,即某些其他程序集丢失,那么将该程序集设置为copylocal = true并重新部署,如果你不确定它的依赖性,则迭代地重复这个 .
如果您仍在寻找答案,请尝试检查question thread . 它帮助我解决了类似的问题 .
编辑:帮助我的解决方案是从NugGet包管理器运行
Update-Package Microsoft.AspNet.WebApi -reinstall
,如Pathoschild所建议的那样 . 然后我必须删除我的.suo文件并重新启动VS,正如Sergey Osypchuk在this thread中所建议的那样 .对我来说,工作时将以下部分添加到
web.config
文件中:这个例子代表MVC 5.1 . 希望它能帮助某人解决这个问题 .
对我来说,它在发布对话框中的设置下的文件发布选项中选择“删除目的地中的其他文件”后开始工作 .
已发布(已部署的环境)中缺少dll . 这就是为什么它在本地工作,即Visual Studio而不是在Azure网站环境中工作的原因 .
只需在程序集的属性(System.Web.Http.WebHost)中复制Local = true,然后进行重新部署,它应该可以正常工作 .
我正在使用vs2012,我认为更新KB2781514改变了一些设置 . 我的MVC4项目中的所有System.Web.Http都变为false并且我保持收到此消息 . 我在发布属性中更改了
All file in this project
但它无效 . 最后,我必须逐个更改Copy Local = true
并解决了这个问题 .我得到了同样的错误,我将我的版本从4改为3并解决了:
我的应用程序中遇到了同样的问题 .
您只需从您在Visual Studio中运行的主项目中复制
system.web.http.webhost
文件,并将其粘贴到已发布的项目bin
目录中 .在此之后它可能会显示相同的错误,但目录名称已更改,它可能是
system.web.http
. 按照与上述相同的步骤 . 它将在上传所有文件后工作 . 这是由于Visual Studio中的nuget包从互联网上下载但在服务器上无法下载 .您可以在项目中找到此文件
bin
目录 .在VS2013(Update 5)/ASP.NET 4.5上,在包含MVC和Web API 2的项目类型“Web Application”下发生了这种情况 . 在创建项目之后和添加任何代码之前发生了错误 . 添加以下配置为我修复了它 . 解析“System.Web.Helpers”后,发出两个类似的错误,表现为“System.Web.Mvc”和“System.Web.WebPages” .
我错过了几个DLL . 即使我下次发布时手动将它们复制到目录中,它们也会消失 . 每个都已设置为在VS中本地复制 . 我的修复方法是将每个设置为本地复制为false,保存,构建然后将每个设置为本地复制为true . 这次我发布了正确发布的所有DLL . 奇怪
如果您的解决方案中有多个项目,并且由于此错误而无法构建其中一个项目,请确保已在该项目中安装了WebApi Core nuget软件包 . 只需添加对System.Web.Http的引用没有帮助,您需要在该项目中安装正确的nuget包 .
我的解决方案中有多个项目,WebApi Core已经安装在另一个项目中 . 我通过右键单击并勾选列表中的程序集来引用System.Web.Http程序集,但它在Azure上不起作用,尽管在本地它可以正常构建 . 我不得不删除手动引用并将WebApi Core nuget包添加到需要程序集引用的每个项目中 .
如果“Copy Local”已经为True,我发现如果删除已发布的文件并再次发布,它有时会起作用 .
例如,如果您使用的是IIS,请删除网站以及发布到的目录的内容,然后重新发布 .
目标位置可能存在旧版本的文件,因此为了确保您不使用旧版本,请在再次发布之前删除所有内容 .