部署到IIS应用程序

时间:2017-10-19 09:57:48

标签: f# asp.net-web-api2 iis-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捆绑为构建的一部分。我们的应用程序部署到负载平衡的环境中。我们的自动部署脚本使用“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

我们观察到,如果应用程序在部署期间未提供请求,则部署将成功完成。但是,如果应用程序处于负载状态并在部署期间提供请求,则应用程序会在部署完成后立即为每个后续请求抛出异常:

  

未处理的异常处理POST for   https://websiteName/application/endpoint: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 :(得分:1)

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

您之前已经描述过您所描述的错误(虽然不是在部署的确切时间内),但上述内容总能解决它。