LucKy_one

Always aiming higher


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

限定ASP.NET Web API返回对象的Content-Type为application/json

发表于 2014-08-25 更新于 2014-08-31
ASP.NET Web API是一套RESTful API开发框架。会自动序列化返回的对象成XML或JSON,其序列化后的格式取决于Request的header:Accept。但是某些情况需要固定返回对象的格式为JSON或XML之一,本文介绍了两种方法。

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
2
HttpResponseMessage resp = new HttpResponseMessage();
resp.Content = new StringContent(jsoncontent, System.Text.Encoding.UTF8, "application/json");

但是这样就失去了自动序列化带来的便捷,以及导致生成Web API Help Page无法捕获返回的对象。
(这也是我为什么要研究这个的原因。。。。结果后来发现可以用[ResponseType(typeof(List<PushPin>))]来指定实际返回的对象)

方法二就是设置HttpConfiguration,设置成只支持application/json。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static class WebApiConfig
{
public static void Register()
{
// Use this class to set configuration options for your mobile service
ConfigOptions options = new ConfigOptions();
// Use this class to set WebAPI configuration options
HttpConfiguration config = ServiceConfig.Initialize(new ConfigBuilder(options));
config.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
var appjsonType = config.Formatters.JsonFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "text/json");
config.Formatters.JsonFormatter.SupportedMediaTypes.Remove(appjsonType);
// To display errors in the browser during development, uncomment the following
// line. Comment it out again when you deploy your service for production use.
// config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
}
}

关键是这几句:

1
2
3
4
5
//删除所有的xml格式,也就是text/xml,application/xml
config.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
//删除text/json
var appjsonType=config.Formatters.JsonFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "text/json");
config.Formatters.JsonFormatter.SupportedMediaTypes.Remove(appjsonType);

其实就是使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 了。

From http://www.iefans.net/ie-dakai-json-xianshi/

# Web API
Consistent Hashing一致性哈希库libconhash的使用与实现
双基准快速排序 Dual-Pivot Quicksort

Liu Tianhe

喜欢金融,喜欢科技
31 日志
29 标签
RSS
GitHub E-Mail
© 2014 – 2022 Liu Tianhe
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Mist v7.3.0