即使使用正确的Accepts标头,WebAPI也不会返回XML

我正在使用ASP.NET WebAPI RC,并托管一个没有什么奇怪的API控制器。 一切工作正常与JSON,但我正在测试使用接受标题请求不同的格式,这就是我遇到麻烦。

我使用jQuery发出AJAX请求,并设置请求的'dataType'参数。 这将正确设置适当的Accept头,如下所示。

$.ajax({
    type: method,
    url: url,
    dataType: "xml",
    data: data || null,
    success: function (data) {
        // omitted
    }
});

这是一个小提琴手请求/响应的保存。 正如你所看到的Accept头文件所说的application / xml,但是WebAPI返回了JSON。 我也尝试手动将Accept头设置为“application / xml”(所以它没有文本/ html的东西),但无济于事。

我错过了什么? (注意:我已经在数据中删除了一些机密信息,但没有调整,否则)

GET http://localhost/insp**snip**6716 HTTP/1.1
Host: localhost
Connection: keep-alive
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.60 Safari/537.1
Accept: application/xml, text/xml, */*; q=0.01
Referer: http://localhost/inspector/api/test?
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: m=34e2:|2c69:t|47ba:t|4e99:t; .INSPECTOR3COOKIE=08BA683091E2A457B1832E9B*snip*F911D9ED97076


HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
Persistent-Auth: true
X-Powered-By: ASP.NET
Date: Fri, 03 Aug 2012 22:27:42 GMT
Content-Length: 1816

{"Id":2416716,"ProjectId":36,"Url":"http://ins *snip, but obviously this is JSON not XML *

我想指出,我并没有调整AppStart中的任何格式化程序或任何其他格式化程序,因此据我了解,默认情况下应启用JSON和XML格式化程序。

更新:我想通了 - 检查下我自己的答案


我想到了!

我在AppStart中有这个,因为我想要Xml序列化程序而不是DataContract序列化程序:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

但是......显然我的模型有些东西让Xml Serializer认为它无法序列化它。 我猜测这是造成WebAPI决定使用JSON格式化器。

这种无害的设置实际上会影响使用哪种格式化程序是完全不直观的。 希望WebAPI的人看到这:)

某种工具可以让你理解内容协商过程的输入和输出,所以你可以调试这样的问题会很好。


这个线程中的当前答案已经提出了很多原因,但总结而言,XmlSerializer仅支持有限数量的类型。

正如AASoft正确描述的那样,在寻找“最佳”格式化程序时,DefaultContentNegotiator会询问每个格式化程序是否可以支持特定类型。 然后它将这些格式化程序与请求中的接受标头进行匹配。

如果它没有根据accept头找到任何匹配,那么它会选择第一个可以序列化类型的匹配项,在本例中为JSON格式化程序。 但是,您可以配置DefaultContentNegotiator而不是返回默认格式,然后返回406 None Accepted状态代码。 这向客户端指示没有找到匹配的表示,而不是发送客户端可能无法使用的数据会生成错误响应。

在“内容协商改进”部分的博客“ASP.NET Web API更新 - 5月14日”[1]中描述了设置此选项。

希望这可以帮助,

亨里克

[1] http://blogs.msdn.com/b/henrikn/archive/2012/05/14/asp-net-web-api-updates-may-14.aspx


我有同样的问题,但通过向我返回的所有模型添加默认构造函数来解决此问题。

XML序列化程序创建空白模型对象,然后通过属性上的setter填充它。 如果设置者被保护或私人,那么该属性也不会被序列化

链接地址: http://www.djcxy.com/p/20397.html

上一篇: WebAPI not returning XML even with correct Accepts header

下一篇: MVC4 Web API Default JSON Serializer