我在C#/ ASP.NET中有一个目前正在开发的网站。当我们投入生产时,我希望在一天中经常发布版本,因为我们修复了错误并添加了功能(例如:http://toni.org/2010/05/19/in-praise-of-continuous-deployment-the-wordpress-com-story/)。
如果您上传新版本的网站甚至更改单个文件,它会启动当前登录的用户,并使他们从任何表单等开始。是否有秘密可以在不干扰.NET站点用户的情况下进行部署?
答案 0 :(得分:5)
您之所以看到这一点,是因为您正在重置应用程序池,从而重置每个人的会话。
最干净的路线是将会话卸载到会话状态服务器,或最小化会话的使用。
解决此问题的一种方法是,如果无法卸载会话,则始终部署到新的虚拟目录。然后,您的面向公众的网址只会重定向到您的最新版本。已登录的所有用户将继续使用旧版本,但任何新用户都将使用新版本。
答案 1 :(得分:5)
如果您对配置文件,应用程序的bin文件夹的内容或类似内容进行了更改,ASP.NET工作进程将与您的应用程序一起重新启动。
这导致已删除的会话和被淘汰的用户。
解决方案是使用默认InProc
以外的其他会话存储方法
您可以通过设置session state mode来实现此目的。 SqlServer
和StateServer
选项为您的问题提供了非常好的补救措施。
SqlServer
模式相对容易设置和启动并运行。 (基本上,它只是创建一个数据库,运行aspnet_regsql,然后将其指定给配置。)如果您没有MS SQL Server或不想使用它,您可以使用StateServer
或创建您自己的提供商并使用Custom
模式。
唯一的限制是您只能使用SqlServer
和StateServer
模式存储可序列化值。
答案 2 :(得分:0)
我认为用户被踢了,因为重新启动了Web服务器应用程序进程。默认情况下,用户会话存储在内存中,会话数据被终止。会话提供程序是web.config中的可配置选项。可能选择外部(Web外应用程序进程)会话提供程序是朝着您期望的方向迈出的一步。
答案 3 :(得分:0)
实现这一目标有两种选择:
无论哪种方式,您还可以灵活地在多台服务器上运行应用程序,以实现性能或故障安全群集。
答案 4 :(得分:0)
根据您在Session对象中存储的内容,您可以在Global.asax的Session_Start处理程序中重建它。我曾经在内部应用程序中执行此操作,我们只在Session中存储了用户的身份,因此我们可以使用他们的授权cookie来重新创建会话。
如果您这样做,请记住一件事:假设用户加载表单然后离开吃午饭,并在他们离开时更新该页面。如果他们回到他们的办公桌并提交表格,他们将把旧版本的表格提交给新的代码隐藏。