一种方法是在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。
此外,如果页面中有某些部分不涉及使用会话,则还需要排除这些页面。