ASP.NET WebAPI是一套RESTful API开发框架。会自动序列化返回的对象成XML或JSON,其序列化后的格式取决于Request的header中的Accept。常见的有:
- application/json
- application/xml
- text/json
- text/xml(这两种已经被废弃了)
如果不指定的话默认返回的Content-Type是:application/json; charset=utf-8
所以使用Chrome和IE11来Get Web Api返回的格式就不同,Chrome是application/xml,而IE11是application/json,就因为两个浏览器请求的Header中的Accept字段不一样。
Chrome:Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
IE11:Accept:text/html, application/xhtml+xml, */*
区别就在于Chrome多了一个application/xml。
###想要指定格式,有两种方法:
方法一是放弃自动序列化,选择返回HttpResponseMessage,再手动设置
1 | HttpResponseMessage resp = new HttpResponseMessage(); |
但是这样就失去了自动序列化带来的便捷,以及导致生成Web API Help Page无法捕获返回的对象。
(这也是我为什么要研究这个的原因。。。。结果后来发现可以用[ResponseType(typeof(List<PushPin>))]
来指定实际返回的对象)
方法二就是设置HttpConfiguration,设置成只支持application/json。
1 | public static class WebApiConfig |
关键是这几句:
1 | //删除所有的xml格式,也就是text/xml,application/xml |
其实就是使Web API不支持其他格式了。但是这种方法有个弊端,是全局的,但是应该可以限定范围,暂时先不管了。
P.S.吐槽下,IE默认是不显示JSON的,会直接下载下来,所以开发人员工具就捕获不到HTTP报文,也没法看Header。找了个方法解决之:
为了测试更方便,一般我使用 Web API 都会设置让 Web API 返回 Json 格式。
在IE浏览器中,当伙同在地址输入 URL 后 IE 浏览器会弹出是否需要下载的提示。
实际上 IE 弹出下载提示也没有什么不好的,但是有时候想要迫不及待的看到Json返回的结果时,又需要反复的下载再打开查看,这个行为就显得让人讨厌了。
如果能够像 Chrome 或 Firefox 可直接看结果就好了。
解决办法也非常简单,需要我们在操作系统的注册表中添加关于 JSON 的 MIME 类型支持,你可以将以下内容编辑成扩展名为 .reg 的文件(文件名随意),然后双击执行将该文件导入注册表:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=dword:00080000
[HKEY_CLASSES_ROOT\MIME\Database\Content Type\text/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"encoding"=dword:00080000
其原理是修改注册表,将 application/json、text/json 两种 Content-Type 开启设置调成与 GIF/PNG/HTML 一致,改为直接用浏览器打开查看。
导入上面的注册表文件以后,再使用IE开启就可以不需要下载即可显示 json 了。