2012-10-29 8 views
17

In WebAPI, sagen ich eine Zeichenfolge in einer HTTP-Antwort eingewickelt zurück:ASP.NET-WebAPI: Wie kann der an den Client zurückgegebene String-Inhalt gesteuert werden?

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

Wenn diese Aktion von jQuery Aufruf der Antworttext behandelt wird, bevor es zurückgeführt wird. So in der xhr, ich so etwas wie diese:

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

Mit anderen Worten, wird die Zeichenfolge in doppelten Anführungszeichen eingewickelt und Sonderzeichen entkommen lassen, so dass sie in der Ausgabe (Ist-Alarm angezeigt ist „Line1 \ r \ n Zeile2 ", so werden die Zeilenumbrüche nicht beibehalten, sondern codiert und im Antworttext angezeigt.

Ich kann dieses Problem umgehen, indem Sie die Anführungszeichen zu entfernen und die Zeilenumbrüche auf dem Client wie so ersetzen:

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

Aber ist es eine Möglichkeit, WebAPI zu sagen, wie String Antworten zu formatieren? Zum Beispiel, um sie nicht in doppelte Anführungszeichen zu setzen und escaped Zeichen zu konvertieren?

Antwort

18

Dies geschieht, weil Ihr Controller JSON zurückgibt, in dem Zeichenfolgewerte angegeben werden.

Eine einfache Lösung ist es, die responseText als JSON zu analysieren und dann können Sie den Wert verwenden, wie beabsichtigt:

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

Dies korrekt die Zeilenumbrüche/Zeilenumbrüche interpretiert.

Alternativ können Sie das text/plain Medientyp in Ihrem Controller angeben:

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

Web API wird dann versuchen, und einen entsprechenden Medientyp-Formatierer für text/plain laden, die leider nicht OOTB existiert. Sie finden eine in WebApiContrib.

+0

Vielen Dank das ist genau das, was ich gesucht habe. Eine abschließende Frage, die besser ist: Den Medientyp-Formatierer zur Konfiguration hinzufügen und "text/plain" als drittes Argument für CreateResponse verwenden oder neues PlaintTextFormatter() als drittes Argument verwenden? – danludwig

+1

Ich würde die erste Option bevorzugen, da Web API dann den entsprechenden Formatierer aus der Konfiguration findet. Wenn Sie den Formatierer ändern, müssen Sie dies nur an einer Stelle tun. –

+0

Warum interpretiert jQuerys Ajax die Antwort als Fehler? –

3

Was Sie suchen, ist eine benutzerdefinierte MediaTypeFormatter. Es klingt, als ob Sie Ihren eigenen benutzerdefinierten implementieren möchten, um ihn zu ersetzen und zu bestehen, oder Sie erstellen einen neuen benutzerdefinierten, alles abhängig davon, was für einen Accept-Header Sie erwarten. Eine gute Nachricht ist, dass Sie bestehende austauschen oder einen neuen MediaType erstellen können.

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

Ja, ich habe dies tatsächlich getan in kleinen Teil, wie ich habe einige der Standard-Formatierungsprogramm ausgelagert: Ein paar Orte, die Sie wird dazu beitragen, den Einstieg hier zu finden z.B JSON mit einem schnelleren, d. H. ServiceStack und es funktioniert gut.

Verwandte Themen