1

我有一个处理程序,像这样,使用 IRequiresSessionState:

public class MyHandler : IHttpHandler, IRequiresSessionState
{
  // code
}

在代码中,我能够读取和设置会话值。我还检查确保调用者已登录。一切正常。

该网站使用表单身份验证,因此在 web.config 中,我有这个:

<authentication mode="Forms">
   <forms loginUrl="Login.aspx" timeout="10" slidingExpiration="true"></forms>
</authentication>

问题是从客户端到服务器代码的 AJAX 调用MyHandler不会延长会话的生命周期!

因此,即使用户正忙于从服务器发送和接收数据,他们也会在最后一次完整页面加载后 10 分钟超时。

在处理程序中,我尝试专门更改值是每次调用的会话,但即使这样也不会延长超时时间。

有什么建议么?

4

1 回答 1

0

终于找到了解决这个问题的办法……有点。

我放弃了让处理程序完成这项工作的尝试,而是调用了一个普通的 ASPX 页面。在该页面中,我删除了 HTML 代码,并使用 Response.Write(...) 发送回一些我想要的 JSON。但是,即使这样,我的会话也没有被延长!

我终于意识到,在 PreRender 事件中,我使用了Response.ClearHeaders(). 这就是问题所在。事实证明,Forms 身份验证系统在需要时更新了会话票证 cookie,但在我的代码运行之前将其添加到标题中。因此,当我清除标题时,我在将新 cookie 发送到浏览器之前将其擦除。

因此,如果您遇到会话未扩展的问题,请检查以确保您的代码未使用ClearHeaders()

于 2010-10-19T18:15:44.217 回答