当我在会话中存储一个值并且之后发生一些异常时,会话状态可能不会被持久化。
Session["MyKey"] = value;
throw new Exception("Test exception");
我发现如果我使用InProc
模式,该值会立即持久化,所以如果发生异常,它仍然会被存储。
但是如果我切换到StateServer
模式,如果发生异常,该值将不会被持久化。我可以写入会话,从会话中再次读取它,但是在发生异常后,就像我在该请求中对会话状态所做的所有更改都将被丢弃(即不持久)。并且任何未来的请求都将读取会话的“旧”状态。
起初我认为这与在出现异常时未发送会话 cookie 有关,但这种行为发生在已经存在且用户已经持有其标识符的会话中。它也明显不同于InProc
to StateServer
,虽然这两种方法处理 cookie 的方式相同,但不同之处只是持久层。
会话状态持久性如何工作?在请求生命周期的哪个时间点,更改实际上是持久化的StateServer
?是否可以强制保持会话状态,因此即使在发生异常后它也会保持不变?