jQuery Ajax 處理 HttpStatus

  今天同事碰到一個問題:當服務端Session失效後用ajax請求數據,頁面端沒法提示和執行跳轉.我最早想到是,在後端用js輸出一個跳轉.發現輸出沒有效果,由於ajax是異步請求,javascript

須要在success函數中特殊處理才能起到做用.能夠在success函數中將處理代碼append到當前頁面中執行.java

js代碼jquery

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

後端代碼ajax

    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代碼:api

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

後臺代碼:session

  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的處理方式:app

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

相關文章
相關標籤/搜索