2012-10-29 68 views
17

在的WebAPI,說我回包裹在一個HTTP響應的字符串:ASP.NET WebAPI:如何控制返回給客戶端的字符串內容?

return Request.CreateResponse(HttpStatusCode.BadRequest, "Line1 \r\n Line2"); 

當調用從jQuery的這個動作,響應文本返回前處理。所以在XHR,我得到的是這樣的:

function success(xhr) { 
    alert(xhr.responseText); // alerts ""Line1 \\r\\n Line2"" 
} 

換句話說,該字符串被雙引號括起來,和特殊字符獲取逃脫,使他們​​出現在輸出(實際的警告是「線路1 \ r \ n Line2「,因此換行符不會被保留,而是被編碼並顯示在響應文本中)。

我可以通過刪除引號並在客戶端上替換換行,像這樣解決這個問題:

var responseText = xhr.responseText.substr(1, xhr.responseText - 2) 
    .replace('\\r', '\r').replace('\\n', '\n'); 

但是,有沒有辦法告訴的WebAPI如何格式化字符串的反應?例如,不要用雙引號包裝它們並轉換轉義字符?

回答

18

這是因爲你的控制器返回JSON中的字符串值被引用。

的簡單解決方案是解析responseText爲JSON,然後可以使用如預期的值:

$.ajax("/api/values/10", { 
    error: function (xhr) { 
     var error = JSON.parse(xhr.responseText); 
     $("textarea").val(error); 
    } 
}); 

這正確地解釋換行符/回車。

或者,你可以在你的控制器指定text/plain媒體類型:然後

return Request.CreateResponse(
    HttpStatusCode.BadRequest, 
    "Line1 \r\n Line2", "text/plain"); 

的Web API會嘗試加載合適的介質類型格式化爲text/plain不幸的是不存在的開箱即用。你會在WebApiContrib找到一個。

+0

謝謝這正是我一直在尋找。最後一個問題,這是更好的:介質類型格式添加到配置和使用「文本/純」作爲第三個參數來CreateResponse,或使用新的PlaintTextFormatter()作爲第三個參數? – danludwig

+1

我贊成第一個選項,因爲Web API會從配置中找到合適的格式化程序。如果你改變格式化程序,你只需要在一個地方做。 –

+0

爲什麼jQuery的ajax將響應解釋爲錯誤? –

3

你是什麼之後是一個自定義MediaTypeFormatter。這聽起來像你想實現自己的自定義的更換和現有的或正在創建新的自定義一個一起取決於什麼什麼Accept頭你期待。好消息是你可以換出現有的或者想出一個你喜歡的新MediaType。這將幫助你開始有幾個地方可以在這​​裏找到:

http://byterot.blogspot.com/2012/04/aspnet-web-api-series-part-5.html

http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

是的,其實我已經在小部分做到了這一點,因爲我已經換了一些默認格式化例如JSON的速度更快,例如ServiceStack,效果很好。

相關問題