C# 当用户会话过期时,或者当请求在302中终止时,如何处理AJAX请求

C# 当用户会话过期时,或者当请求在302中终止时,如何处理AJAX请求,c#,ajax,session,jquery,redirect,C#,Ajax,Session,Jquery,Redirect,也有人问过其他类似的问题,但它们并不倾向于处理通用的多用途解决方案。他们倾向于只处理用户身份验证问题。有时302适用于其他情况 那么,如何为ajax请求创建一个通用的302处理程序,同时维护应用程序中其他任何内容的功能呢?似乎您可以添加一个条件来检查特定状态。如果请求是XMLHttpRequest对象,则在readyState为4时另外检查状态: if(request.readyState == 4){ if(request.status == 302) { doSomething(

也有人问过其他类似的问题,但它们并不倾向于处理通用的多用途解决方案。他们倾向于只处理用户身份验证问题。有时302适用于其他情况


那么,如何为ajax请求创建一个通用的302处理程序,同时维护应用程序中其他任何内容的功能呢?

似乎您可以添加一个条件来检查特定状态。如果请求是XMLHttpRequest对象,则在readyState为4时另外检查状态:

if(request.readyState == 4){
  if(request.status == 302) {
    doSomething();
  }
  else {
    doSomethingElse();
  }
}
编辑:

或者,如果您不想使用纯javascript(因为公平地说,您确实将其标记为jquery ajax),那么如下所示:

$.ajax({
  statusCode: {
    302: function() {
      doSomething();
    }
  }
});

似乎您可以添加一个条件来检查该特定状态。如果请求是XMLHttpRequest对象,则在readyState为4时另外检查状态:

if(request.readyState == 4){
  if(request.status == 302) {
    doSomething();
  }
  else {
    doSomethingElse();
  }
}
编辑:

或者,如果您不想使用纯javascript(因为公平地说,您确实将其标记为jquery ajax),那么如下所示:

$.ajax({
  statusCode: {
    302: function() {
      doSomething();
    }
  }
});

我们最后提出的解决方案有点老套,但看起来相当优雅

首先,在global.asax文件中拦截来自ajax查询的任何302

protected void Application_EndRequest()
{
    var context = new HttpContextWrapper(Context);
if (Context.Response.StatusCode == 302 && context.Request.IsAjaxRequest())
    {
        Context.Response.Clear();
        Context.Response.StatusCode = 308;
    }
}
我们发明了一个308状态码,这样浏览器就不会拦截302并导致jquery失败

然后在javascript全局文件的某个地方添加以下内容

$(document).ajaxError(function (e, request, errorThrown, exception) {
    if (request.status == "308") {
        window.location = request.getResponseHeader('location');
    }
});

这使得jquery能够检测重定向,然后将用户引导到请求的页面。

我们最终提出的解决方案有点老套,但看起来相当优雅

首先,在global.asax文件中拦截来自ajax查询的任何302

protected void Application_EndRequest()
{
    var context = new HttpContextWrapper(Context);
if (Context.Response.StatusCode == 302 && context.Request.IsAjaxRequest())
    {
        Context.Response.Clear();
        Context.Response.StatusCode = 308;
    }
}
我们发明了一个308状态码,这样浏览器就不会拦截302并导致jquery失败

然后在javascript全局文件的某个地方添加以下内容

$(document).ajaxError(function (e, request, errorThrown, exception) {
    if (request.status == "308") {
        window.location = request.getResponseHeader('location');
    }
});

这使得jquery能够检测重定向,然后将用户引导到请求的页面。

至少就我所检查的而言,该解决方案似乎存在问题,因为302由浏览器处理,当jquery获得状态代码时,它实际上不是302,但是设置为0可能会有帮助:您无法使用
statusCode
捕获302。在jQuery访问它之前,它由浏览器的JavaScript引擎处理,因此最终会得到一个200(或其他)和重定向的响应。这个解决方案似乎确实存在问题,至少据我所查,因为302是由浏览器处理的,当jQuery获得状态码时,它实际上不是302,但是设置为0可能会有帮助:您无法使用
statusCode
捕获302。在jQuery访问它之前,它由浏览器的JavaScript引擎进行处理,因此最终得到200(或其他)和重定向响应。