2010-05-19 32 views
14

我有一个正在开发的C#/ ASP.NET网站。当我们在生产中时,我想在一天中频繁地发布版本,因为我们修复了错误并添加了功能(例如:http://toni.org/2010/05/19/in-praise-of-continuous-deployment-the-wordpress-com-story/)。使用ASP.NET网站进行连续部署?

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

+8

我认为你需要改变你如何存储会话。我相信你需要去基于文件或基于SQL的存储。我相信你现在将它们存储在proc中,我认为它们将它们存储在appgroup的内存空间中。虽然不能给出更多细节,对不起 – 2010-05-19 19:29:10

+1

@hamlin是正确的 – 2010-05-19 19:31:22

+1

@hamlin,这是值得回答的。 – roufamatic 2010-05-19 19:31:32

回答

5

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

这会导致已删除的会话和踢出的用户。

解决方法是使用除默认InProc以外的其他会话存储方法。
您可以通过设置session state mode来实现此目的。 SqlServerStateServer选项为您的问题提供了很好的补救措施。

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

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

+0

同意这是一个会议的事情,我意识到我在原始问题(哦)以后回答这个很长时间。我们遇到了SQL Server状态死锁和更大流量负载的问题。我们结束了与微软AppFabric缓存,这是MS Azure使用。到目前为止,这对我们来说是一个坚实的解决方案。 – ctc 2013-04-11 15:13:36

5

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

最干净的路线是将会话卸载到会话状态服务器,或将会话使用量降到最低。

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

0

我想用户被踢,因为web服务器应用程序进程重新启动。默认情况下,用户会话存储在内存中,会话数据被终止。会话提供程序是web.config中的可配置选项。可能会选择外部(Web外部应用程序进程)会话提供程序是朝着您期望的方向迈出的一步。

0

有两个备选方案,以实现这一目标:

  1. 不使用会话的。 (您可以使用Cookie进行身份验证)
  2. 使用其他会话状态模式。状态服务器或SQLServer。 http://msdn.microsoft.com/en-us/library/ms178586(v=VS.80).aspx

无论哪种方式,您还将获得灵活性,以便能够在多台服务器上运行应用程序以实现性能或故障安全集群。

0

根据您存储在Session对象中的内容,您可能能够在Global.asax的Session_Start处理程序中重新构建它。我曾经在一个内部应用程序中这样做,我们只在Session中存储了用户的身份,因此我们可以使用他们的授权cookie来重新创建会话。

有一点需要记住,如果你这样做:说一个用户加载一个表单,然后离开吃午饭,然后在他们离开时更新该页面。如果他们返回他们的办公桌并提交表单,他们会将旧版本的表单提交给新代码。

+0

我也不确定,但你必须做些明确的,这将是一个潜在的失败点。也许某种形式的版本化,所以表单可以看到用户是否发布了过时的表单并更新了代码隐藏表单。 无论如何,如果你不能使用cookie方法,你不必担心:) – 2010-05-20 17:14:13