1

当我在会话中存储一个值并且之后发生一些异常时,会话状态可能不会被持久化。

Session["MyKey"] = value;
throw new Exception("Test exception");

我发现如果我使用InProc模式,该值会立即持久化,所以如果发生异常,它仍然会被存储。

但是如果我切换到StateServer模式,如果发生异常,该值将不会被持久化。我可以写入会话,从会话中再次读取它,但是在发生异常后,就像我在该请求中对会话状态所做的所有更改都将被丢弃(即不持久)。并且任何未来的请求都将读取会话的“旧”状态。

起初我认为这与在出现异常时未发送会话 cookie 有关,但这种行为发生在已经存在且用户已经持有其标识符的会话中。它也明显不同于InProcto StateServer,虽然这两种方法处理 cookie 的方式相同,但不同之处只是持久层。

会话状态持久性如何工作?在请求生命周期的哪个时间点,更改实际上是持久化的StateServer是否可以强制保持会话状态,因此即使在发生异常后它也会保持不变?

4

1 回答 1

0

文档说

https://msdn.microsoft.com/en-us/library/system.web.httpapplication.releaserequeststate.aspx

HttpApplication.ReleaseRequestState 事件。在 ASP.NET 执行完所有请求事件处理程序后发生。此事件导致状态模块保存当前状态数据。

于 2016-09-14T13:03:21.193 回答