2015-10-12 26 views
3

嘿所有我從我的回調得到一個奇怪的回報時使用AJAX POST方法來調用我的web服務。jQuery AJAX附加到JSON返回數據「d:null」

的web服務發送回JSON是這樣的:

Dim ser As New System.Web.Script.Serialization.JavaScriptSerializer() 
Dim strResponse As String = ser.Serialize(results) 

Context.Response.Clear() 
Context.Response.ContentType = "application/json" 
Context.Response.AddHeader("content-length", strResponse.Length.ToString()) 
Context.Response.Write(strResponse) 
HttpContext.Current.ApplicationInstance.CompleteRequest() 

值以上strResponse的是:

"[{\"Column1\":\"0589S2F\"},{\"Column1\":\"53699FNS\"},{\"Column1\":\"C38VVFD\"},{\"Column1\":\"LFD55F\"},{\"Column1\":\"2ERfG\"},{\"Column1\":\"0079\"},{\"Column1\":\"2054\"},{\"Column1\":\"054FGW\"}]" 

出於某種原因,我的ajax返回 OK但仍然進入錯誤邏輯,錯誤消息爲:

ERROR: "[{\"Column1\":\"0589S2F\"},{\"Column1\":\"53699FNS\"},{\"Column1\":\"C38VVFD\"},{\"Column1\":\"LFD55F\"},{\"Column1\":\"2ERfG\"},{\"Column1\":\"0079\"},{\"Column1\":\"2054\"},{\"Column1\":\"054FGW\"}]"{"d":null} 

注意它是如何追加{「d」:空}我的請求結束......哪裏是從,因爲我不是在strResponse發送這樣的事情後面來? ??

我的Ajax請求代碼:

var sqlQ = "SELECT TOP 50 LTRIM(RTRIM(REPLACE(OID, ' ', ''))) FROM vwPSDAT WHERE OID != ''"; 

$.ajax({ 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    url: 'http://zzzz/Service1.asmx/theQ', 
    data: JSON.stringify({ qString: [sqlQ] }), 
    async: true, 
    cache: false, 
    success: function (data) { 
     var obj = jQuery.parseJSON(data); 
     console.log('done!');     
    }, 
    error: function (XMLHttpRequest, textStatus, errorThrown) { 
     console.log('ERROR: ' + XMLHttpRequest.responseText); 
    } 
}); 
+1

所以..我不知道你的問題,但我想指出,從客戶端傳遞SQL查詢是一個可怕的想法。沒有什麼可以阻止用戶打開控制檯或使用fiddler向服務器發送任意語句(如可能是'DROP TABLE vwPSDAT')。 –

+0

當你使用'dataType:'json'時,jQuery會自動解析響應。你不需要使用jQuery.parseJSON'。但這不是問題,因爲你沒有進入「成功」功能。 – Barmar

+0

Web服務中必須有一些其他部分正在編寫'{「d」:null}'。 – Barmar

回答

3

那麼它似乎我只是需要加入Context.Response.Flush()寫入頁面之前。

Context.Response.Clear() 
Context.Response.ContentType = "application/json" 
Context.Response.AddHeader("content-length", strResponse.Length.ToString()) 
Context.Response.Flush() 
Context.Response.Write(strResponse) 
HttpContext.Current.ApplicationInstance.CompleteRequest() 

一旦我做到了,一切都很好。

+0

刷新應該在寫入後調用 –

+0

而似乎你已改爲'[ScriptMethod(UseHttpGet = true)]'並開始使用GET?因爲這不適合我 –

0

這對我來說也很好,但是Flush引發了一個異常:「服務器在發送HTTP頭之後無法清除頭文件」,但是,如果我在visual studio中通過它,那麼json就會被解析。