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

17
在WebAPI中,假设我返回一个被 HTTP 响应包装的字符串:
return Request.CreateResponse(HttpStatusCode.BadRequest, "Line1 \r\n Line2");

当使用jQuery调用此操作时,响应文本在返回之前被处理。所以在xhr中,我得到类似这样的内容:

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

2个回答

18

这是因为你的控制器返回的JSON中字符串值都被引号括起来了。

一个简单的解决方案是将responseText解析为JSON,然后您可以按照预期使用该值:

这是由于你的控制器返回的 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 加载一个适当的媒体类型格式化程序,但可惜默认情况下没有。您可以在 WebApiContrib 中找到一个。


谢谢,这正是我要找的。最后一个问题,哪个更好:将媒体类型格式化程序添加到配置中并使用“text/plain”作为CreateResponse的第三个参数,还是使用新的PlaintTextFormatter()作为第三个参数? - danludwig
1
我倾向于第一种选项,因为Web API将从配置中找到适当的格式化程序。如果您要更改格式化程序,则只需要在一个地方进行更改即可。 - Ben Foster
因为 OP 返回了错误请求 (400) 响应。return Request.CreateResponse(HttpStatusCode.BadRequest, "Line1 \r\n Line2"); - Ben Foster
我正在使用上面建议的格式化程序。它可以编译,但在运行时,我在ReadFromStreamAsync方法上遇到了一个错误:“找不到类型或命名空间名称'HttpContent'(您是否缺少using指令或程序集引用?)”,即使我已经使用了System.Net.Http,并且我可以看到变量“content”的所有方法和属性。 - SF Developer

3
你需要的是一种自定义的 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

是的,实际上我已经在某些方面进行了这样的操作,例如用更快的格式化程序(即ServiceStack)替换默认的格式化程序(如JSON),效果非常好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接