2016年7月28日 星期四

C#的webservice回傳json時結尾會多出{"d":null}

如果在webservice中
設定this.Context.Response.ContentType = "application/json";
會將回傳格式設定為json,而如果沒有回傳值的話,會預設回傳{"d":null}
修正問題方式

            JsonSerializerSettings s = new JsonSerializerSettings() ;
            string ss = JsonConvert.SerializeObject(bnbLogin, s);
            //輸出json格式

            this.Context.Response.Clear();
            this.Context.Response.ContentType = "application/json";
            this.Context.Response.AddHeader("content-length", ss.Length.ToString());
            this.Context.Response.Flush();

            //輸出json格式
            this.Context.Response.Write(JsonConvert.SerializeObject(bnbLogin));
            HttpContext.Current.ApplicationInstance.CompleteRequest();

重點是中間的content-length,將Response.Write的字串大小固定,就不會多傳{"d":null}了

--

補充:content-length是POST資料的長度,如果傳的內容包含中文時會因為編碼的關係而可能發生錯誤,將

             this.Context.Response.AddHeader("content-length", ss.Length.ToString());

length修改為依照所編碼的字串長度,像我的Server使用UTF8編碼就修改如下:

this.Context.Response.AddHeader("content-length", System.Text.Encoding.UTF8.GetBytes(ss).Length.ToString());