2012-10-29 23 views
17

Trong WebAPI, nói rằng tôi trả về một chuỗi được bọc trong một phản ứng HTTP:ASP.NET WebAPI: Cách kiểm soát nội dung chuỗi được trả lại cho khách hàng?

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

Khi gọi hành động này từ jQuery, văn bản trả lời được xử lý trước khi nó được trả về. Vì vậy, trong XHR, tôi nhận được một cái gì đó như thế này:

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

Nói cách khác, các chuỗi được bọc trong dấu ngoặc kép, và ký tự đặc biệt được thoát để họ xuất hiện trong đầu ra (cảnh báo thực tế là "Line1 \ r \ n Dòng 2 ", vì vậy các dòng mới không được bảo toàn, mà được mã hoá và hiển thị trong văn bản phản hồi).

tôi có thể làm được việc này bằng cách loại bỏ các dấu ngoặc kép và thay thế các dòng mới trên máy khách như vậy:

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

Nhưng có một cách để nói WebAPI cách định dạng phản ứng chuỗi? Ví dụ, không để bọc chúng trong dấu ngoặc kép và chuyển đổi ký tự thoát?

Trả lời

18

Điều này xảy ra do bộ điều khiển của bạn trả về JSON trong đó giá trị chuỗi được trích dẫn.

Một giải pháp đơn giản là phân tích những responseText như JSON và sau đó bạn có thể sử dụng giá trị như mong đợi:

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

này giải thích một cách chính xác các ngắt dòng/xuống dòng.

Hoặc bạn có thể xác định loại phương tiện truyền thông text/plain ở điều khiển của bạn:

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

Web API sau đó sẽ cố gắng và tải một formatter loại phương tiện thích hợp cho text/plain mà tiếc là không tồn tại OOTB. Bạn sẽ tìm thấy một trong số WebApiContrib.

+0

Cảm ơn bạn đây chính xác là những gì tôi đang tìm kiếm. Một câu hỏi cuối cùng, tốt hơn: Để thêm định dạng kiểu phương tiện vào cấu hình và sử dụng "text/plain" làm đối số thứ 3 cho CreateResponse, hoặc sử dụng PlaintTextFormatter() làm đối số thứ 3? – danludwig

+1

Tôi sẽ ưu tiên tùy chọn đầu tiên vì Web API sau đó sẽ định vị trình định dạng phù hợp từ cấu hình. Nếu bạn thay đổi trình định dạng, bạn chỉ cần thực hiện ở một nơi. –

+0

Tại sao ajax của jQuery giải thích phản hồi là lỗi? –

3

Điều bạn đang làm sau là tùy chỉnh MediaTypeFormatter. Có vẻ như bạn muốn triển khai tùy chỉnh của riêng mình để thay thế và tồn tại hoặc bạn đang tạo một tùy chỉnh mới tất cả cùng nhau tùy thuộc vào những gì chấp nhận tiêu đề bạn đang mong đợi. Tin tốt là bạn có thể trao đổi những cái hiện có hoặc đưa ra một MediaType mới mà bạn thích. Một vài nơi mà sẽ giúp bạn bắt đầu được tìm thấy ở đây:

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

Vâng, tôi đã thực sự làm được điều này một phần nhỏ như tôi đã hoán đổi ra một số định dạng mặc định ví dụ JSON có tốc độ nhanh hơn, tức là ServiceStack và nó hoạt động rất tốt.

Các vấn đề liên quan