【问题标题】:ASP.NET WebAPI: How to control string content returned to client?ASP.NET WebAPI:如何控制返回给客户端的字符串内容?
【发布时间】:2026-01-06 17:05:01
【问题描述】:

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

【问题讨论】:

    标签: asp.net-web-api string-formatting httpresponse


    【解决方案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 中找到一个。

    【讨论】:

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

    您所追求的是自定义 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,它工作得很好。

    【讨论】:

      最近更新 更多