我在目前正在开发的C#/ASP.NET中有一个网站。当我们正在生产中时,我想在一天的过程中经常进行发行,因为我们修复错误并添加功能(像这样: http://toni.org/2010/05/19/in-praise-of-continous-deployment-the-wordpress-com-story/).

如果您上传了网站的新版本,甚至更改了单个文件,它将启动当前登录的用户,并使其从任何表单等开始。能够在不干扰用户的.NET站点的情况下进行部署有秘密吗?

有帮助吗?

解决方案

如果您更改配置文件,应用程序的bin文件夹的内容或类似的内容,则与您的应用程序一起重新启动ASP.NET工作过程。

这将导致删除的会话和启动用户。

解决方案是使用默认的其他会话存储方法 InProc.
您可以通过设置 会话状态模式. 。这 SqlServerStateServer 选项为您的问题提供了很好的补救措施。

SqlServer 模式相对容易设置并启动并运行。 (基本上,它只是创建一个数据库,运行ASPNET_REGSQL,然后将其指定到配置。)如果您没有MS SQL Server或不想使用它,则可以使用 StateServer, ,或创建自己的提供商并使用 Custom 模式。

唯一的限制是您只能将可序列化值存储 SqlServerStateServer 模式。

其他提示

您看到这一点的原因是因为您正在重置应用程序池,从而重置每个人的会话。

最清洁的路线是将您的会话卸载到会话状态服务器,或最大程度地减少您对会话的使用。

解决此问题的一种方法是,如果您无法卸载会话是始终部署到新的虚拟目录。然后,您的公共URL将其重定向到您的最新版本。所有已经登录的用户都将继续使用旧版本,但是任何新用户都会使用新版本。

有两种替代方法可以实现:

  1. 完全不要使用会话。 (您可以使用cookie进行身份验证)
  2. 使用另一种会话状态模式。状态服务器或SQLServer。 http://msdn.microsoft.com/en-us/library/ms178586(V=VS.80).aspx

无论哪种方式,您还将获得灵活性,以便能够在多个服务器上运行您的应用程序以进行性能或失败的安全群集。

根据您在会话对象中存储的内容,您可以在global.asax的session_start处理程序中重建它。我曾经在一个内部应用程序中这样做,在该应用程序中,我们才真正将用户的身份存储在会话中,因此我们可以使用他们的授权cookie来重新创建会话。

如果您这样做,请记住一件事:说用户加载表格,然后离开午餐,然后在他们不在时更新该页面。如果他们返回办公桌并提交表格,他们将向新的代码范围提交旧版本。

我想用户被踢了,因为重新启动了Web服务器应用程序过程。默认情况下,用户会话存储在内存中,会话数据被杀死。会话提供商是Web.config中可配置的选项。可能是选择外部(Web-application-process)会话提供商是迈向期望的一步。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top