2012-10-29 3 views
17

In WebAPI, dire torno una corda avvolta in una risposta HTTP:ASP.NET WebAPI: come controllare il contenuto di stringhe restituito al client?

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

Quando si richiama questa azione da jQuery, il testo di risposta viene trattato prima di essere restituito. Così nel XHR, ho qualcosa di simile:

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

In altre parole, la stringa viene avvolto tra virgolette, e caratteri speciali ottengo sfuggito in modo che appaiano nell'output (avviso effettiva è "Riga1 \ r \ n Line2 ", quindi le newline non sono conservate, ma piuttosto codificate e mostrate nel testo di risposta).

posso ottenere intorno a questo rimuovendo le virgolette e rimpiazzando le nuove righe sul client in questo modo:

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

Ma c'è un modo per dire WebAPI come formattare le risposte delle stringhe? Ad esempio, non per racchiuderli tra virgolette e convertire caratteri di escape?

risposta

18

Ciò accade perché il controller restituisce JSON in cui vengono citati i valori di stringa.

Una soluzione semplice è quella di analizzare il responseText come JSON e quindi è possibile utilizzare il valore come previsto:

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

Questa interpreta correttamente le interruzioni di riga/ritorni a capo.

In alternativa, è possibile specificare il tipo text/plain supporto nel controller:

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

Web API sarà quindi provare e caricare un adeguato tipo di supporto per il formattatore text/plain che purtroppo non esiste OOTB. Ne troverai uno in WebApiContrib.

+0

Grazie, questo è esattamente quello che stavo cercando. Un'ultima domanda, che è meglio: per aggiungere il formattatore del tipo di supporto alla configurazione e usare "text/plain" come terzo argomento di CreateResponse o utilizzare il nuovo PlaintTextFormatter() come terzo argomento? – danludwig

+1

Preferirei la prima opzione poiché l'API Web individuerà quindi il formattatore appropriato dalla configurazione. Se cambi mai il formattatore devi solo farlo in un posto. –

+0

Perché ajax di jQuery interpreta la risposta come errore? –

3

Quello che cercate è un'abitudine MediaTypeFormatter. Sembra che tu desideri implementare il tuo personalizzato da sostituire ed esistente oppure ne stai creando uno completamente personalizzato a seconda di quale sia l'intestazione Accept che ti aspetti. La buona notizia è che puoi scambiare quelle esistenti o inventare un nuovo MediaType che ti piace. Un paio di posti che vi aiuterà ad iniziare si possono trovare qui:

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

Sì, in realtà ho fatto questo in piccola parte come ho scambiato fuori alcuni dei formattatore predefinito per esempio JSON con uno più veloce, cioè ServiceStack e funziona alla grande.

Problemi correlati