在部署到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.04.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 的相对性能问题

IIS中应用程序切换物理路径遇到的问题

关于WIN7 家庭版 iis 部署问题

将 Asp.net 应用程序部署到 IIS 服务器时出错

Windows Server 2008 多站点部署HTTPS

将 ASP.NET MVC NHibernate 应用程序部署到 IIS7 时出错