17

在 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 如何格式化字符串响应?例如,不要将它们用双引号括起来并转换转义字符?

4

2 回答 2

18

发生这种情况是因为您的控制器正在返回 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中找到一个。

于 2012-10-29T20:40:28.327 回答
3

您所追求的是自定义MediaTypeFormatter。听起来您希望实现自己的自定义来替换和现有的,或者您正在一起创建一个新的自定义,具体取决于您期望的 Accept 标头。好消息是你可以换掉现有的或者想出一个你喜欢的新媒体类型。可以在这里找到一些可以帮助您入门的地方:

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,它工作得很好。

于 2012-10-29T20:32:52.093 回答