13

我正在尝试将 .NET Web 应用程序部署到 IIS (7.5),而不会给用户带来任何麻烦。我已经确定禁用重叠回收是错误的,但我每次仍然遇到同样的问题。

每次我为站点上传新的二进制文件时,IIS 都会在工作进程启动新进程之前终止它。因此,每次我上传新的二进制文件时,用户都会收到以下错误消息:

“/”应用程序中的服务器错误。无法加载文件或程序集“MyApplicationWeb”或其依赖项之一。该进程无法访问该文件,因为它正被另一个进程使用。(来自 HRESULT 的异常:0x80070020)

我不知道如何无缝地做到这一点。现在我只是上传二进制文件;但是当上传发生(或本地副本)时,它会给出上面引用的行为。我也尝试使用网络花园,但结果相同。

我不是在寻找什么:

  • 如何使用外部负载平衡器解决它(这是一个功能性解决方案,但它对于少数服务器来说是一个糟糕的解决方案,如果只有一个服务器,它根本无法工作)
  • 如何在自定义错误页面中通过刷新创建 hack-around(因为它有一些明显的问题,但更重要的是根本无法使用 Web 服务/ajax)。

我真的认为这应该是可行的http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/24e3c22e-79a9-4f07-a407-dbd0e7f35432.mspx?mfr=true

更新:在上面的文章中,他们说:

但是,由于关闭或启动的关闭超时值是可配置的,因此如果工作进程未在时间限制内完成对现有请求的服务,则可以在它仍在为请求提供服务时终止它。

我不知道在哪里可以找到这个值,也不知道它是什么默认值。如果它少于几秒钟,它可能会解释我的结果。

附言。我将它发布在 SO 而不是 SF/Webmasters 等上,因为我认为这种知识对于那些不积极参与开发的人来说可能是最少的,我希望这没关系。

4

5 回答 5

17

在部署 ASP.Net 应用程序时,我在服务器上创建一个新文件夹并更改 IIS 中网站的主目录。这提供了零停机时间部署和快速回滚位置,以防出现不可预见的问题。在未来的更新中,我废弃旧版本并重复该过程,以便始终有一个回滚位置。

更新 - 关机时间限制

http://www.iis.net/ConfigReference/system.applicationHost/applicationPools/add/processModel详细介绍了为工作人员配置关闭时间限制的详细信息。默认值为 1 分 30 秒。在链接页面中查找 shutdownTimeLimit 部分。

更新 - 更多信息

类似的问题有一个很好的答案

这样做的要点是,由于覆盖现有文件,复制机制对文件采取了排他性锁定,并且如果不使用 app_offline.htm 或上述建议的机制,就不可能进行无缝部署。阅读链接的答案,因为它更深入。

于 2011-03-18T21:49:19.250 回答
4

我同意 Smirkin 的回应 - 更新第二个文件夹并将 IIS 主目录更改为指向另一个文件夹。另一个优点是您有一个简单的回滚路径(只需将 IIS 主目录切换回来)。

我写了一篇关于如何使用 Powershell 执行此操作的脚本的帖子 - 希望它有所帮助:http ://davidduffett.net/post/4833657659/blue-green-deployment-to-iis-with-powershell

您应该能够直接从您的持续集成系统中使用此脚本。

于 2011-04-22T16:45:13.843 回答
3

虽然Smirkin 的回答为管理员提供了一种很好的无缝方式,可以在很少或没有停机时间的情况下部署站点,并且应该解决缺少程序集/引用的问题,如果您在代码库中有重大更改(即删除旧页面,更改表单等),那么对于在切换之前启动进程并在切换之后完成它的任何用户(即,他们在切换之前请求页面,开始填写它),使用此方法仍然可能导致一些“麻烦” ,然后在切换到新目录后提交页面)。

我知道您不想让我这么说,但是如果没有启用 Sticky-Sessions 的负载平衡器,您将无法让人们继续使用旧版本的网站,直到他们完成处理新网站新版本上的会话 - 通过更改应用程序的主目录,IIS 将重新编译应用程序并重新启动进程。这样,您可以将旧服务器设置为继续为其当前连接提供服务,但告诉负载平衡不要向其发送任何新连接。

但是,您可以采取另一个步骤来帮助缓解经常出现的问题:

将MachineKey配置为常量值而不是AutoGenerate- 这意味着当 AppPool 回收时它将使用相同的密钥,因此能够解密会话 cookie、视图状态等。

于 2011-03-22T17:06:28.423 回答
2

我的猜测是您有一个病毒扫描程序或其他类型的索引过程,一旦您将文件复制到那里,它就会锁定文件。

于 2011-03-18T21:43:07.037 回答
-2

你可以使用 app_offline.htm

此解决方案不是无缝的,但您可以使用

<meta http-equiv="refresh" content="5" />

在 htm 文件中,因此浏览器会自动刷新而无需任何 javascript。

干杯

于 2011-03-22T17:11:11.440 回答