我正在努力了解如何在网站上有用户的情况下处理实时,正常运行的ASP.NET(2.0或更高版本)应用程序的更新。
例如,假设SO是一个ASP.NET Web应用程序项目。项目代码编译为BIN文件夹中的单个.DLL。现在,SO上经常有用户,那么如果您在使用网站时使用Visual Studio .NET“发布”功能(或者只是手动再次使用FTP),用户的操作/会话会发生什么?
相反,创建一个ASP.NET网站会减轻上述方案可能存在或不存在的任何问题吗?我开始开发一个网站作为用户驱动的Web应用程序,我想确保我对此缺乏经验不会惹恼我[想要]全天候的[潜在]许多用户。
编辑:对不起,我应该把它放在一个更准确的上下文中。假设该网站由网络托管服务托管,每月收费。我不会管理服务器本身,只是网络主机允许作为其服务的用户。答案 0 :(得分:5)
我在IIS中创建了两个网站。一个是生产Web站点,另一个是带有HttpHandler的静态Web站点,它将所有请求发送到单个静态“我们正在更新”HTML页面,该页面使用HTTP 503服务不可用。通常,关闭更新网站。在更新的时候,我们停止生产网站,启动更新网站,现在我们可以随心所欲地制作生产网站,而不必担心DLL被锁定或工作流程需要被关闭。
我开始这样做是因为
这无法解决的问题包括
我见过的其他方法包括
如果您找到更好的方法,请告诉我们!
答案 1 :(得分:4)
更改为asp.net网站模型不会产生任何影响,因为回收也会发生,有些更改会触发它:web.config,global.asax,app_code。
回收后,用户仍然会登录,因为asp.net只会验证语法。这是给你使用固定的机器钥匙,否则它将在每次回收时改变。无论如何,这是你想要做的事情,因为如果密钥在请求之间发生变化,即视图状态验证,嵌入式资源(URL的解密失败),其他东西可能会中断。
如果您可以将会话置于进程之外,例如在sql server中,您将避免失去会话。如果你不能,你的代码将不得不考虑。有很多情况下你可以避免使用会话,而其他情况你可以包装它并在会话被清理时重新检索信息。这应该为您留下一些您知道可能给用户带来麻烦的特定案例,因此对于那些您已经做过其他人已经提出的建议。
答案 2 :(得分:1)
一种解决方案可能是将您的应用程序部署到负载平衡环境(Web场) 部署新版本时,您将使用负载均衡器将请求重定向到您未部署到的服务器。
答案 3 :(得分:1)
App_offline.htm是一个很好的解决方案。
在SO中,我们在部署开始时看到应用程序当前不可用的页面。
答案 4 :(得分:0)
我不确定SO是如何处理它的..但我们通常会设置一个控股页面。因此,用户所做的事情(添加问题或回答问题)并没有得到更新。一旦他更新了某些东西,他就会看到一个暂停页面,要求他在一段时间后再尝试。
如果我是用户,我通常会按后退按钮以确保我输入的内容已保存在浏览器历史记录中,以便我稍后发布。
某些网站使用是在群集环境中,因此我将一台服务器脱机并通知负载均衡器她将无法使用,一旦我确保新版本正常工作我就让它生效..我也这样做下一个服务器的事情。
我们还有其他选择吗?
答案 5 :(得分:0)
这不是技术解决方案,而是设置计划维护窗口。您可以提前通知,向您的用户提供公平的警告,表明该应用程序在该时间范围内可能无法使用。