2012-10-29 14 views
17

W WebAPI, powiedzmy wrócę łańcuch owinięty w odpowiedzi http:ASP.NET WebAPI: Jak kontrolować zawartość napisów zwróconych do klienta?

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

Kiedy powołując tę ​​akcję z jQuery, tekst odpowiedzi jest traktowany zanim zostanie on zwrócony. Więc w XHR, mam coś takiego:

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

Innymi słowy, ciąg zostaje owinięte w cudzysłowach i znaki specjalne się uciec, dzięki czemu pojawiają się one na wyjściu (rzeczywista alert jest „Line1 \ r \ n Line2 ", więc znaki nowej linii nie są zachowywane, ale są zakodowane i pokazane w tekście odpowiedzi).

mogę obejść ten problem poprzez usunięcie cytaty i zastępując znaki nowej linii na kliencie tak:

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

Ale czy jest jakiś sposób, aby powiedzieć WebAPI jak formatować reakcje łańcuchowe? Na przykład, aby nie zawijać ich w podwójne cudzysłowy i nie konwertować znaków zbiegów?

Odpowiedz

18

Dzieje się tak, ponieważ kontroler zwraca JSON, w którym są podawane wartości łańcuchów.

Prostym rozwiązaniem jest do analizowania responseText jako JSON, a następnie można użyć wartości jako przeznaczone:

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

to poprawnie interpretuje przerwach Line/powrotu karetki.

Alternatywnie można określić typ text/plain mediów w kontrolerze:

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

Web API następnie spróbuj i załadować odpowiedni typ nośnika formatowania dla text/plain która niestety nie istnieje OOTB. Znajdziesz go w WebApiContrib.

+0

Dziękuję, to jest dokładnie to, czego szukałem. Jedno ostatnie pytanie, które jest lepsze: Aby dodać formatator typu mediów do konfiguracji i użyć "text/plain" jako trzeciego argumentu do CreateResponse lub użyć nowego PlaintTextFormatter() jako trzeciego argumentu? – danludwig

+1

Preferuję pierwszą opcję, ponieważ Web API zlokalizuje wtedy odpowiedni formatter z konfiguracji. Jeśli kiedykolwiek zmienisz formatyzator, musisz to zrobić tylko w jednym miejscu. –

+0

Dlaczego ajax jQuery interpretuje odpowiedź jako błąd? –

3

To, czego szukasz, to niestandardowy MediaTypeFormatter. Wygląda na to, że chcesz zaimplementować swój niestandardowy, który zastąpi i będzie istnieć, lub stworzysz nowy niestandardowy, w zależności od tego, jakiego oczekujesz nagłówka Accept. Dobrą wiadomością jest to, że możesz zamienić istniejące lub wymyślić nowy rodzaj MediaType. Kilka miejsc, które pomogą Ci zacząć można znaleźć tutaj:

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

Tak, ja rzeczywiście zrobił to w dużej mierze jak mam zamienione niektóre z domyślnym formater na przykład JSON z szybszym, tj. ServiceStack i działa świetnie.

Powiązane problemy