ASP.NET WebAPI: How to control string content returned to client?

danludwig picture danludwig · Oct 29, 2012 · Viewed 13.8k times · Source

In WebAPI, say I return a string wrapped in an HTTP response:

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

When invoking this action from jQuery, the response text is treated before it is returned. So in the xhr, I get something like this:

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

In other words, the string gets wrapped in double quotes, and special characters get escaped so that they appear in the output (actual alert is "Line1 \r\n Line2", so the newlines are not preserved, but rather encoded and shown in the response text).

I can get around this by removing the quotes and replacing the newlines on the client like so:

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

But is there a way to tell WebAPI how to format string responses? For example, not to wrap them in double quotes and convert escaped characters?

Answer

Ben Foster picture Ben Foster · Oct 29, 2012

This happens because your controller is returning JSON in which string values are quoted.

A simple solution is to parse the responseText as JSON and then you can use the value as intended:

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

This correctly interprets the line breaks/carriage returns.

Alternatively you can specify the text/plain media type in your controller:

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

Web API will then try and load an appropriate media type formatter for text/plain which unfortunately does not exist OOTB. You'll find one in WebApiContrib.