在部署到IIS应用程序时升级FSharp.Core版本,程序集引用错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在部署到IIS应用程序时升级FSharp.Core版本,程序集引用错误相关的知识,希望对你有一定的参考价值。
我们升级了FSharp.Core.dll
,作为在IIS 8(ASP.NET Web API)上部署Web应用程序的一部分,并在部署后立即开始查看FSharp.Core FileLoad异常。 FSharp.Core.dll
版本从4.3.0.0
到4.3.1.0
。
我们的标准自动部署涉及使用更新的二进制文件(dll),global.asax和web.config替换应用程序文件夹内容,从而导致IIS回收应用程序池。 FSharp.Core.dll
捆绑作为构建的一部分。我们的应用程序部署到负载平衡的环境中。我们的自动部署脚本使用“robocopy”清除应用程序目录(下面的mywebapp)并将新内容复制到其位置。
典型的IIS应用文件夹结构:
mywebapp/bin/fsharp.core.dll
mywebapp/bin/custom-fsharp-lib.dll
mywebapp/bin/custom-csharp-lib.dll
mywebapp/bin/System.Web.Http.dll, etc…
mywebapp/global.asax
mywebapp/web.config
我们观察到,如果应用程序在部署期间未提供请求,则部署成功完成。但是,如果应用程序处于负载状态并在部署期间提供请求,则应用程序会在部署完成后立即为每个后续请求抛出异常:
https://websiteName/application/endpoint的未处理异常处理POST:System.IO.FileLoadException无法加载文件或程序集'FSharp.Core,Version = 4.3.1.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。定位的程序集的清单定义与程序集引用不匹配。 (来自HRESULT的异常:0x80131040) - 在WebAppFunction.Execute ... ..(等)
看到这个异常后,我们检查了应用程序二进制文件,发现FSharp.Core.dll
版本是4.3.1.0
(即升级后的版本已正确部署)。看来,如果在部署期间提供流量,则新部署的应用程序无法找到正确的FSharp.Core.dll
版本,即使它存在于应用程序bin文件夹中。似乎应用程序可能仍然对旧的FSharp.Core.dll
版本有一些处理。
服务器重新启动,IISReset或回收IIS apppool后,此问题仍然存在。我们的解决方案是将部署回滚到之前的版本(使用FSharp.Core.dll v4.3.0.0
),之后应用程序恢复。然后,我们将新构建(使用FSharp.Core.dll v4.3.1.0
)单独部署到每个服务器,同时在停止使用apppool的情况下拉出负载均衡器,从而确保在部署期间无负载,并且新构建成功部署。
在部署Web应用程序期间,我们从未观察到此行为,无论是否正在升级程序集版本。有没有其他人用FSharp.Core.dll
遇到过这个问题,如果有的话,可以解释这个行为吗?
您可能需要在web.config中添加程序集重定向:
<dependentAssembly>
<assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.3.1.0" newVersion="4.3.1.0" />
</dependentAssembly>
您之前已经描述过的错误(虽然不是在部署的确切时间内),但上述内容始终是解决它的原因。
以上是关于在部署到IIS应用程序时升级FSharp.Core版本,程序集引用错误的主要内容,如果未能解决你的问题,请参考以下文章
部署到 IIS8 时 EF 6 与 EF 5 的相对性能问题