2012-10-29 71 views
17

在的WebAPI,说我回包裹在一个HTTP响应的字符串:ASP.NET WebAPI:如何控制返回给客户端的字符串内容?

return Request.CreateResponse(HttpStatusCode.BadRequest, "Line1 \r\n Line2"); 

当调用从jQuery的这个动作,响应文本返回前处理。所以在XHR,我得到的是这样的:

function success(xhr) { 
    alert(xhr.responseText); // alerts ""Line1 \\r\\n Line2"" 
} 

换句话说,该字符串被双引号括起来,和特殊字符获取逃脱,使他们​​出现在输出(实际的警告是“线路1 \ r \ n Line2“,因此换行符不会被保留,而是被编码并显示在响应文本中)。

我可以通过删除引号并在客户端上替换换行,像这样解决这个问题:

var responseText = xhr.responseText.substr(1, xhr.responseText - 2) 
    .replace('\\r', '\r').replace('\\n', '\n'); 

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

回答

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不幸的是不存在的开箱即用。你会在WebApiContrib找到一个。

+0

谢谢这正是我一直在寻找。最后一个问题,这是更好的:介质类型格式添加到配置和使用“文本/纯”作为第三个参数来CreateResponse,或使用新的PlaintTextFormatter()作为第三个参数? – danludwig

+1

我赞成第一个选项,因为Web API会从配置中找到合适的格式化程序。如果你改变格式化程序,你只需要在一个地方做。 –

+0

为什么jQuery的ajax将响应解释为错误? –

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

是的,其实我已经在小部分做到了这一点,因为我已经换了一些默认格式化例如JSON的速度更快,例如ServiceStack,效果很好。

相关问题