• jQuery Ajax 处理 HttpStatus


      今天同事碰到一个问题:当服务端Session失效后用ajax请求数据,页面端无法提示和执行跳转.我最先想到是,在后端用js输出一个跳转.发现输出没有效果,因为ajax是异步请求,

    需要在success函数中特殊处理才能起到作用.可以在success函数中将处理代码append到当前页面中执行.

    js代码

    $('#btnAshx').click(function () {
                    $.ajax(
                    {
                        url: "/ASHX/AjaxHandler.ashx?action=Redirect",
                        dataType: "text",
                        success: function (data) {
                            $('#divResult').append(data);
                        }
                    }
                    );
                });

    后端代码

        public class AjaxTest : IHttpHandler
        {
    
            public void ProcessRequest(HttpContext context)
            {
                context.Response.Write("<script>window.location.href='Default.aspx'</script>");
    
    
            }
        }

        这样处理的话有一个问题,需要对每一个ajax请求做特殊处理才能让页面跳转,但是session失效应该是统一处理.后来想到可以利用ajax的error函数来处理这个问题,服务端制造请求错误.但是这样又带来了新的问题,如果有后台特殊的错误提示需要返回,返回将被覆盖.详细查看ajax的api后发现其提供了statusCode的处理函数.那么这样可以利用后天输出http status来统一通知session失效的问题.

    js代码:

      $.ajaxSetup({
                    statusCode: {
                        400: function () {
                            window.location.href = "Default.aspx";
                        }
                    }
                });

    后台代码:

      public class AjaxTest : IHttpHandler
        {
    
            public void ProcessRequest(HttpContext context)
            {
                //context.Response.Write("<script>window.location.href='Default.aspx'</script>");
                context.Response.StatusCode = 400;
                context.Response.End();
    
            }
        }

    如果请求的是页面,同httphandler的处理方式:

    JS:

      $('#btnAspx').click(function () {
                    $.ajax(
                    {
                        url: "AjaxTest.aspx?action=Redirect",
                        dataType: "text",
                        success: function (data) {
                            //$('#divResult').append(data);
                        }
                    }
                    );
                });

    后台:

      string action = Request.QueryString["action"];
                if (action == "Redirect")
                {

          //HttpContext.Current.Response.Write("<script type='text/javascript'>window.location.href='Default.aspx'</script>");
          HttpContext.Current.Response.StatusCode = 400;
          HttpContext.Current.Response.End();

                }

    如果请求的是WCF,直接使用Response.Write没有效果,需要使用WebOperationContext类

    JS:

     $('#btnWcf').click(function () {
                    $.ajax({
                        url: "WCF.svc/RedirectTest",
                        dataType: "text",
                        success: function (data) {
                           //  $('#divResult').append(data);
                        }
                    });

    后台:

     [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
        public class WCF
        {
            // 在此处添加更多操作并使用 [OperationContract] 标记它们
            [WebGet()]
            public void RedirectTest()
            {
                ////HttpContext.Current.Response.Write("<script type='text/javascript'>window.location.href='Default.aspx'</script>");
                //HttpContext.Current.Response.StatusCode = 400;
                //HttpContext.Current.Response.End();          
                WebOperationContext ctx = WebOperationContext.Current;
                ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.BadRequest;
              
            }
        }

    在查找资料的时候,发现可以通过服务端其他方式来处理,不过这里就不介绍了. 

    PS:注意jQuery1.4.1是不支持statusCode函数的.确定jQuery版本是否支持.

    参考:

    http://stackoverflow.com/questions/140104/how-can-i-return-a-custom-http-status-code-from-a-wcf-rest-method

    http://stackoverflow.com/questions/17477738/jquery-ajax-statuscode-methods-not-being-called

    http://stackoverflow.com/questions/13936892/wcf-string-method-that-also-serves-a-download-with-response-write-only-working

  • 相关阅读:
    $NOIP2012$ 题解报告
    $NOIP2011$ 题解报告
    $NOIP2007$ 题解报告
    $NOIP2006$ 题解报告
    $NOIP2005$ 题解报告
    $NOIP2003$ 题解报告
    $NOIP2002$ 题解报告
    $NOIP2001$ 题解报告
    $NOIP2000$ 题解报告
    $NOIP1999$ 题解报告
  • 原文地址:https://www.cnblogs.com/kulong995/p/3381015.html
Copyright © 2020-2023  润新知