如何在不丢失会话的情况下更新asp.net webforms或mvc应用程序?

时间:2016-01-21 12:29:20

标签: c# asp.net asp.net-mvc session webforms

这是我的情景。 我在Windows Server 2012上的iis 8上发布了我的webforms或mvc应用程序。 然后我的客户请求别的东西,我必须更新代码隐藏。

例如,表单上的新输入或db上的新列。我正在使用会话变量进行会员或购物车流程。

当我在服务器中复制新的bin文件时(当我发布我的应用程序时),会话终止。如何解决此更新问题? 我该怎么办才能保持会话活着?因为访客正在丢失他们的购物车。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

许多事情会导致IIS丢弃会话:

  • 大量文件更新,ASP.NET主动为您重新编译。
  • 会话自然超时
  • 更新会导致它的web.config 回收
  • 网站应用程序池因其他原因而回收

听起来你正在与第一个发生冲突,并且没有办法阻止这种行为。

听起来你正在使用“In Process”会话,这是默认的,这就是你丢失篮子等的原因。

来自MSDN

  

InProc模式,它将会话状态存储在Web服务器的内存中。这是默认值。

其他选项包括:

  

StateServer模式,它将会话状态存储在名为ASP.NET状态服务的单独进程中。这确保了会话状态   如果重新启动Web应用程序并保留会话,则保留   状态可用于Web场中的多个Web服务器。

     

SQLServer模式将会话状态存储在SQL Server数据库中。这可确保在Web应用程序中保留会话状态   重新启动并使会话状态可用于多个Web   Web场中的服务器。

     

自定义模式,可让您指定自定义存储提供程序。

将会话切换到其他任何一个会使您能够更新,但迁移不是即时的。

答案 1 :(得分:3)

  

当我在服务器中复制新的bin文件时(当我发布我的应用程序时),   会话死了。如何解决此更新问题?我该怎么做   保持会话活着?

默认情况下,Session-State Mode是InProc。您想要使用StateServer或SQLServer。

在Windows Azure中,我们使用自定义模式并存储在Redis Cache中。

  

因为访客正在丢失购物车。

即使这样,会话状态也不可靠。

我通常在数据库中创建购物车表。然后在客户端浏览器中将 cookie 内的购物车ID保存在其中。

此外,如果用户登录,我还将UserId保存在同一个表中,这样用户仍然可以在任何计算机上查看他/她的购物车。

例如,amazon.com有类似的方法。