使用ASP.NET网站进行持续部署?

15

我有一个用C#/ASP.NET开发的网站,目前正在开发中。当我们进入生产环境后,我希望在一天内频繁发布更新,如修复错误和添加功能(例如:http://toni.org/2010/05/19/in-praise-of-continuous-deployment-the-wordpress-com-story/)。

如果你上传新版本的网站甚至只更改单个文件,它将强制退出当前已登录的用户并使他们不得不重新填写表单等。是否有一个秘诀能够在不干扰.NET网站用户的情况下进行部署?


8
我认为你需要改变存储会话的方式。我认为你需要使用基于文件或 SQL 的存储方式。我相信你目前是在 "inproc" 中存储它们,这会将它们存储在应用程序组的内存空间中。很抱歉不能提供更多细节。 - Brian Webster
1
@hamlin,这值得回答。 - roufamatic
应用程序会话如何与表单身份验证连接? - Claudio Redi
我的意思是,如果会话与身份验证票证相关联,Web Farm 将无法对用户进行身份验证,除非您将会话存储在公共位置,但这并不正确。 - Claudio Redi
5个回答

5
你看到这个信息是因为你正在重置应用程序池,从而重置了所有人的会话。
最干净的解决方法是将你的会话转移到会话状态服务器上,或者最小化使用会话。
如果你无法将会话卸载,一个解决方法是始终部署到一个新的虚拟目录。你的公共URL然后只会重定向到最新版本。所有已经登录的用户将继续使用旧版本,但任何新用户都将使用新版本。

5
如果您更改配置文件、应用程序的 bin 文件夹或类似内容,ASP.NET 工作进程将重新启动,并随之重启应用程序。这会导致已删除的会话和被踢出的用户。
解决方法是使用除默认的 InProc 之外的其他会话存储方法。您可以通过设置 会话状态模式 来实现此目的。SqlServer 和 StateServer 选项为您的问题提供了非常好的解决方案。
SqlServer 模式相对容易设置并运行起来。(基本上只需创建一个数据库、运行 aspnet_regsql,然后将其指定到配置中。) 如果您没有 MS SQL Server 或不想使用它,则可以使用 StateServer,或者创建自己的提供程序并使用 Custom 模式。
唯一的限制是您只能使用 SqlServer 和 StateServer 模式存储可序列化的值。

同意这是一个会话问题,我意识到我在很久以后回答了这个问题(哦好吧)。我们遇到了SQL Server状态死锁的问题,因为有更大的流量负载。最终我们选择了微软AppFabric缓存,这也是MS Azure使用的。到目前为止,这对我们来说是一个可靠的解决方案。 - ctc

0

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


0

有两种方法可以实现这个目标:

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

无论哪种方式,您都将获得灵活性,能够在多个服务器上运行应用程序以提高性能或故障安全聚集。


0
根据您在Session对象中存储的内容,您可以在Global.asax的Session_Start处理程序中重建它。我曾在一个内部应用程序中这样做,我们实际上只在Session中存储了用户的身份信息,因此我们可以使用他们的授权cookie来重新创建会话。
如果您这样做,请记住一件事:假设用户加载了一个表单然后离开吃午饭,在他们离开期间,您更新了该页面。如果他们返回桌子并提交表单,则将旧版本的表单提交给新的代码后端。

我也不确定,但你必须做一些明确的事情,这可能是一个潜在的失败点。也许可以对表单进行某种版本控制,以便表单可以查看用户是否将过时的表单发布到更新的代码后端。无论如何,如果您无法使用cookie方法,就不必担心这个问题 :) - Cory Grimster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接