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

本文探讨了在不使用Context.Response.End()的情况下,如何避免JSON响应中夹带HTML内容的问题。通过设置Response.SuppressContent属性为true,成功解决了JSON数据与HTML源代码混合导致的解析错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到一個問題,頁面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;

問題解決。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值