ASP.NETWebAPI:如何控制返回给客户端的字符串内容?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (40)

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

提问于
用户回答回答于

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

用户回答回答于

你所追求的是一个自定义的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,并且效果很好。

扫码关注云+社区

领取腾讯云代金券