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