我们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
Run Code Online (Sandbox Code Playgroud)
我们观察到,如果应用程序在部署期间未提供请求,则部署成功完成.但是,如果应用程序处于负载状态并在部署期间提供请求,则应用程序会在部署完成后立即为每个后续请求抛出异常:
处理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后,此问题仍然存在.我们的解决方案是将部署回滚到之前的版本(with FSharp.Core.dll v4.3.0.0),之后应用程序恢复.然后,我们将新构建(with FSharp.Core.dll v4.3.1.0)单独部署到每个服务器,同时在apppool停止的情况下退出负载均衡器,从而确保在部署期间无负载,并且新构建成功部署.
在部署Web应用程序期间,我们从未观察到此行为,无论是否正在升级程序集版本.有没有其他人遇到过这个问题FSharp.Core.dll,如果有的话,可以解释这个行为吗?