ASP.NET ASHX处理程序会话超时和jQuery AJAX调用

3
我正在开发一个ASP.NET网络表单应用程序,并使用jQuery AJAX调用大部分操作。对于服务器操作,我正在使用ASHX处理程序。
我的问题是,当用户的会话过期(在一段不活动时间后),并且用户点击一个按钮以进行jQuery AJAX调用时,如何从处理程序中检测到会话已过期并返回特定的JSON数据。
这里有一个类似的问题similar qustion,但没有一个恰当的答案。
提前感谢您。
敬礼,
Rifky

这个问题表明你在提问之前没有仔细查看。这里有一个类似的问题,可能会对你有所帮助 链接 - Ahmad
@Ahmad-San,我搜索了一个类似的问题,但是没有找到答案。有一个类似的问题,但没有正确的答案。无论如何,你提供的链接是使用jquery检查会话值的链接。但我的问题是,如果会话过期并且发出ajax请求,则需要在处理程序中检查会话是否过期。 - Rifky
@Ahmad-San,这表明我在提问之前已经搜索了网络,所以对问题打-1分是不公平的。 - Rifky
我试图删除-1,但网站告诉我必须先编辑问题。对此造成的不便请谅解。 - Ahmad
请问我能得到任何回应吗? :-( - Rifky
1个回答

1
一种方法是在global.asax文件中检查任何ashx的会话是否已过期。如果已过期,则返回一个json会话过期对象。在客户端,您将检查该对象是否存在,并通过javascript将用户重定向到登录页面。
因此,在您的global.asax文件中,您将拥有以下内容:
   protected void Application_AcquireRequestState(object sender, EventArgs e)
    {
        var url = HttpContext.Current.Request.Url.OriginalString;
        var extension = Path.GetExtension(url);
        if (extension == ".ashx" && HttpContext.Current.Session.Contents.Count == 0)
        {
            HttpContext.Current.Response.StatusCode = 440;
            HttpContext.Current.Response.TrySkipIisCustomErrors = true;
            HttpContext.Current.Response.Write(new JObject(new JProperty("sessionExpired")).ToString());
            HttpContext.Current.Response.End();
        }
    }

然后,您将为所有ajax查询创建一个全局的ajax事件错误处理程序,该处理程序查找“sessionExpired”对象:

$(document).ajaxError(function (event, xhr, settings)
{
    if (xhr.responseText && $.parseJSON(xhr.responseText).sessionExpired)
    {
        window.location.replace("loginUrl.aspx");
        return;
    }
});

这种方法的好处是,你只需要这两个代码片段就可以获得合理的会话过期处理。然而,这种方法也有缺点:
所有的ashx文件都必须至少具有IReadOnlySessionState或IRequiresSessionState接口。否则,会话过期逻辑将被触发,因为会话将被假定为空。如果你不想要这个,那么你需要一种排除某些.ashx文件的方法,比如排除任何包含你的ashx文件路径的特定路径的url。
此外,如果页面中有某些部分不涉及使用会话,则还需要排除这些页面。

谢谢你的回答。它对我有帮助。 - Konstantin Zadiran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接