当我在会话中存储值并且之后发生了一些异常时,会话状态可能不会持久存在。
Session["MyKey"] = value;
throw new Exception("Test exception");
我发现如果我使用InProc
模式,则值会立即保留,因此如果发生异常,无论如何都会存储它。
但是如果我切换到StateServer
模式,如果发生异常,该值将不会持久存在。我可以写入会话,从会话中再次读取它,但是在发生异常之后,就像我对该请求中的会话状态所做的所有更改都将被丢弃(即不会被保留)。任何未来的请求都会读取" old"会议状况。
起初我认为它与会话cookie的相关性在异常的情况下没有被发送,但是对于已经存在且用户已经拥有其标识符的会话会发生这种情况。它也明显不同于InProc
到StateServer
,而这两种方法都以相同的方式处理cookie,它只是不同的持久层。
会话状态如何持续有效? 请求生命周期中的哪一点实际上持续存在StateServer
?是否可以强制持久化会话状态,因此即使发生异常也会持久存在?
答案 0 :(得分:0)
文档说
https://msdn.microsoft.com/en-us/library/system.web.httpapplication.releaserequeststate.aspx
HttpApplication.ReleaseRequestState事件。 ASP.NET完成执行所有请求事件处理程序后发生。 此事件会导致状态模块保存当前状态数据。