我正在asp.net中开发一个Web表单应用程序,并使用jquery ajax调用进行大多数操作。对于服务器操作我正在使用ashx处理程序。
我的问题是当用户的会话到期时(在一段时间的无效之后),并且用户单击一个进行jquery ajax调用的按钮,如何从处理程序检测到会话过期并返回特定的json。
a similar qustion但没有正确答案。
提前感谢。
RGDS Rifky
答案 0 :(得分:1)
一种方法是检查您的global.asax文件中的任何ashx的会话是否已过期。如果有,则返回一个json session expired对象。在客户端,您将检查该对象是否存在,并通过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();
}
}
然后,您将为查找“sessionExpired”对象的所有ajax查询创建一个全局ajax事件错误处理程序:
$(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。
此外,如果您网页的某些部分不涉及使用会话,那么您还需要排除这些网页。