Context.Response.End(); VS HttpContext.Current.ApplicationInstance.CompleteRequest();

今天遇到一個問題,頁面Client端send一個ajax請求,然後在server端返回一個json的字符串

        $.ajax({
                url: "xxxxx.aspx",
                type: "post",
                data: { action: "xxx", Id: $('#hiddenId').val(), fileKey: $('.hiddenFileKey').val(), tableName: selectedTableName }
            })
            .done(function (data) {
                processResponse(data, false);
            })
            .fail(function (jqXHR, textStatus, errorThrown) {
                alert(errorThrown);
            });            

功能很簡單,可是因為 Context.Response.End(); 的一慣壞名聲(強制返回),在server端不能使用,於是只能改為使用HttpContext.Current.ApplicationInstance.CompleteRequest(); 本來也沒有什麼問題。

                    Context.Response.Clear();
                    Context.Response.ContentType = "application/json";
                    Context.Response.AddHeader("content-length", ResponseJsonStr.Length.ToString());
                    Context.Response.Write(ResponseJsonStr);//Context.Response.End();
                    ApplicationInstance.CompleteRequest();
                    return;               

就是上面的代碼,卻出現了一個奇怪的問題(目前為止不清楚問題的原因,同樣的代碼在其他頁面可以正常使用),返回到client頁面的json string除了json data的部分之外,還包含了整個頁面的html source code. 導致json parse時出現error

JSON.parse: unexpected non-whitespace character after JSON data

無奈之下,去網上尋求解決辦法,發現解法都是要使用 Context.Response.End();。TT

終於在查看關於Context.Response的文檔時發現一個property: SuppressContent,可以控制內容是否回傳client 端。

於是將server端代碼改為

                    Context.Response.Clear();
                    Context.Response.ContentType = "application/json";
                    Context.Response.AddHeader("content-length", ResponseJsonStr.Length.ToString());
                    Context.Response.Write(ResponseJsonStr);
                    Context.Response.Flush(); // Sends all currently buffered output to the client.
                    //Context.Response.End();
                    Response.SuppressContent = true; // Gets or sets a value indicating whether to send HTTP content to the client.
                    ApplicationInstance.CompleteRequest();
                    return;

問題解決。

 

posted @ 2018-03-13 18:25  日光之下无新事  阅读(1212)  评论(0编辑  收藏  举报