如何动态修补正在运行的ASP.NET应用程序?

时间:2009-07-17 20:34:04

标签: asp.net patch

有没有人有一个如何修补正在运行的asp.net应用程序的示例?我想象的场景是应用程序可以查找已知的中央服务器以获取更新版本。将较新的文件下载到临时位置,然后自行修补。

我可以看到的问题是,文件观察程序将获取任何文件更改并重新加载应用程序域,这将停止当前的修补过程。我认为每个写入的文件都会触发重新加载应用程序。

5 个答案:

答案 0 :(得分:3)

修补是什么意思?

如果您的意思是更新,您只需将更新文件复制到应用程序目录即可。当前活动请求将使用应用程序的最后编译版本完全提供,然后将重新编译以满足后续请求。真的没什么特别的。

答案 1 :(得分:3)

除非您正在查看特定文件的某些文件,否则您可以更新现有的aspx文件,而不会降低应用程序的速度。用户下次刷新浏览器时,他们会看到页面更新。但要小心,如果你已经为页面添加了额外的服务器控件,并且DLL尚未更新,那么你将遇到问题。

如果您更新应用程序的web.config或DLL文件,这将触发ASPNET工作进程的重新加载,并且任何新用户都将遭受您通常期望的“第一个延迟”。

如果你担心这个过程,并且可以承受一些“停机时间”,我建议你创建一个执行以下操作的脚本:

  1. 将名为App_Offline.htm的文件上载到Web应用程序的根目录。 IIS将立即看到此文件并将用户重定向到该文件,而不进行任何.NET处理。您甚至可以在根文件夹中保存名为App_Offline_Disabled.htm的文件,并在时机成功时重命名。

  2. 根据需要复制需要更新,覆盖/重命名/复制的所有文件。

  3. 删除(或重命名)App_Offline.htm文件,以便IIS开始将用户定向到更新的应用程序。如果您正在观看脚本运行,您甚至可以自己点击网站以获得“首次加载”惩罚,这样您的最终用户就会一如既往地看到美观和清晰。

  4. 同样,我不知道你是否能够以这种方式承担网站的停机时间,但我认为这个过程本身很容易编写脚本以提供一个很好的自动化类型过程。

答案 2 :(得分:0)

我不知道有任何自动化方法。似乎更容易依赖自动构建脚本来推断对服务器的更改。

如果您将会话状态保留在外部进程中,则可以更新站点(这将导致重新编译),而不会将用户踢出。在等待重新编译时,它们只会经历更长的加载时间。

答案 3 :(得分:0)

我只是在引发filewatcher事件时检查版本信息。如果程序集的版本与您正在考虑修补的活动程序集不同,则继续执行该副本。如果没有,那么只需忽略该事件。另外一个问题是,当没有实际的版本更改时,为什么要复制到临时目录中的文件正在被检索?

答案 4 :(得分:0)

如果其他人无法使用app_offline.htm技巧,我发现这篇文章解释了如何禁用子文件夹的文件监控

http://www.dominicpettifer.co.uk/Blog/36/stop-iis-appdomain-restarts-when-a-folder-is-deleted