Подтвердить что ты не робот

ASP.NET WebAPI: как управлять содержимым строки, возвращаемым клиенту?

В WebAPI скажу, что я возвращаю строку, завернутую в ответ HTTP:

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

При вызове этого действия из jQuery текст ответа обрабатывается до его возвращения. Поэтому в xhr я получаю что-то вроде этого:

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

Иными словами, строка обертывается в двойные кавычки, а специальные символы получают экранированные, чтобы они отображались на выходе (фактическое предупреждение - "Line1\r\n Line2", поэтому строки новой строки не сохраняются, а скорее закодированы и показано в тексте ответа).

Я могу обойти это, удалив кавычки и заменив новые строки на клиенте так:

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

Но есть ли способ сказать WebAPI как форматировать ответы на строки? Например, чтобы не обернуть их в двойные кавычки и преобразовать экранированные символы?

4b9b3361

Ответ 1

Это происходит потому, что ваш контроллер возвращает JSON, в котором указаны строковые значения.

Простое решение состоит в том, чтобы проанализировать responseText как JSON, а затем вы можете использовать значение по своему усмотрению:

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

Это правильно интерпретирует разрывы строк/возврат каретки.

В качестве альтернативы вы можете указать тип носителя text/plain в вашем контроллере:

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

Затем Web API попытается загрузить соответствующий формат медиафайлов для text/plain, который, к сожалению, не существует OOTB. Вы найдете его в WebApiContrib.

Ответ 2

Зачем вам нужен пользовательский MediaTypeFormatter. Похоже, вы хотите реализовать свой собственный пользовательский для замены и существующего или вы создаете новый настраиваемый все вместе в зависимости от того, что ожидается в заголовке Accept. Хорошая новость заключается в том, что вы можете заменить существующие или создать новый MediaType. Несколько мест, которые помогут вам начать, можно найти здесь:

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

Да, я на самом деле сделал это в малой части, поскольку я поменял некоторые форматы форматирования по умолчанию, например. JSON с более быстрым, то есть ServiceStack, и он отлично работает.