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

dan*_*wig 17 httpresponse string-formatting asp.net-web-api

在WebAPI中,假设我返回一个包含在HTTP响应中的字符串:

return Request.CreateResponse(HttpStatusCode.BadRequest, "Line1 \r\n Line2");
Run Code Online (Sandbox Code Playgroud)

从jQuery调用此操作时,响应文本将在返回之前得到处理.所以在xhr中,我得到这样的东西:

function success(xhr) {
    alert(xhr.responseText); // alerts ""Line1 \\r\\n Line2""
}
Run Code Online (Sandbox Code Playgroud)

换句话说,字符串用双引号括起来,特殊字符被转义,以便它们出现在输出中(实际警报是"Line1\r \n Line2",因此新行不会被保留,而是编码并显示在响应文本).

我可以通过删除引号并替换客户端上的换行符来解决这个问题:

var responseText = xhr.responseText.substr(1, xhr.responseText - 2)
    .replace('\\r', '\r').replace('\\n', '\n');
Run Code Online (Sandbox Code Playgroud)

但有没有办法告诉WebAPI如何格式化字符串响应?例如,不要用双引号将它们包装起来并转换转义字符?

Ben*_*ter 18

发生这种情况是因为您的控制器返回引用了字符串值的JSON.

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

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

这正确地解释了换行符/回车符.

或者,您可以text/plain在控制器中指定媒体类型:

return Request.CreateResponse(
    HttpStatusCode.BadRequest, 
    "Line1 \r\n Line2", "text/plain");
Run Code Online (Sandbox Code Playgroud)

然后,Web API将尝试加载适当的媒体类型格式化程序,text/plain但遗憾的是OOTB不存在.你会在WebApiContrib中找到一个.