首页 文章

在部署到IIS应用程序时升级FSharp.Core版本,程序集引用错误

提问于
浏览
8

我们在IIS 8(ASP.NET Web API)上部署Web应用程序时升级了 FSharp.Core.dll ,并在部署后立即开始查看FSharp.Core FileLoad异常 . FSharp.Core.dll 版本从 4.3.0.0 变为 4.3.1.0 .

我们的标准自动部署涉及使用更新的二进制文件(dll),global.asax和web.config替换应用程序文件夹内容,从而导致IIS回收应用程序池 . FSharp.Core.dll 捆绑为构建的一部分 . 我们的应用程序部署到负载 balancer 的环境中 . 我们的自动部署脚本使用“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

我们观察到,如果应用程序在部署期间未提供请求,则部署成功完成 . 但是, if the application is under load and serving requests during the deployment ,应用程序在部署完成后立即为每个后续请求抛出异常:

未处理的异常处理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 的这个问题,如果有的话,可以解释这个行为吗?

1 回答

  • 0

    您可能需要在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>
    

    您之前已经描述过的错误(虽然不是在部署的确切时间内),但上述内容始终是解决它的原因 .

相关问题