ASP.NET中的无缝部署(IIS在新工作进程准备好之前杀死工作进程)

时间:2011-03-18 21:28:56

标签: asp.net iis deployment worker-process

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

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

  '/'应用程序中的服务器错误。可以   不加载文件或程序集   'MyApplicationWeb'或其中一个   依赖。这个过程不能   访问该文件,因为它正在   由另一个进程使用。 (例外   来自HRESULT:0x80070020)

我不知道如何无缝地完成这项工作。现在我只是上传二进制文件;但是当上传发生时(或本地副本),它将给出上述引用的行为。我也尝试使用Web园,但结果相同。

我不想要的:

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

鉴于http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/24e3c22e-79a9-4f07-a407-dbd0e7f35432.mspx?mfr=true

,我认为这应该是可行的

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

  

但是,因为关机超时   关机或启动的价值是   可配置,工作进程可以   在它静止时被终止   如果没有完成请求服务   服务于现有的请求   时间限制。

我不知道在哪里找到这个值,也不知道它的默认值。如果不到几秒钟就可以解释我的结果。

PS。 我发布的是SO而不是SF /网站管理员等,因为我认为这种知识可能在那些不积极参与开发的人中很少,我希望这是正确的。

5 个答案:

答案 0 :(得分:17)

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

更新 - 关闭时间限制

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

更新 - 更多信息

Similar question with a great answer

这样做的要点是,由于覆盖现有文件,复制机制会对文件进行独占锁定,并且如果不使用app_offline.htm或上述建议的机制,则无法进行无缝部署。阅读相关答案,因为它更深入。

答案 1 :(得分:4)

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

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

您应该可以直接从持续集成系统中使用此脚本。

答案 2 :(得分:3)

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

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

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:-2)

你可以使用app_offline.htm

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

<meta http-equiv="refresh" content="5" />
在htm文件中,因此浏览器会在没有任何javascript的情况下自动刷新。

欢呼