WebApi2官网学习记录---Content Negotiation
Content Negotiation的意思是:当有多种Content-Type可供选择时,选择最合适的一种进行序列化并返回给client。
主要依据请求中的Accept、Accept-Charset、Accept-Encoding、Accept-Language这些属性决定的,但也会查看其它属性
如,如果请求中包含“ X-Requested-With”(ajax请求),在没哟其它Accept时,则使用JSON。
Content Negotiation的工作原理
首先,pipeline从HttpConfiguration 对象中获得IContentNegotiator 服务,同时也会从 HttpConfiguration.Formatters中获得所有的media formatters 。接下来,pipeline调用 IContentNegotiatior.Negotiate传入一下值:
- 要序列化的对象
- 所有media formatters
- HTTP Request
Negotiate 返回2个值:
- 选择的formatter
- 要输出的media type
如果没有合适的formatter,Negotiate方法返回null,client会收到406错误(无法访问)
下面是一个controller直接使用content negotiation的例子“
public HttpResponseMessage GetProduct(int id)
{
var product = new Product()
{ Id = id, Name = "Gizmo", Category = "Widgets", Price = 1.99M }; IContentNegotiator negotiator = this.Configuration.Services.GetContentNegotiator(); ContentNegotiationResult result = negotiator.Negotiate(
typeof(Product), this.Request, this.Configuration.Formatters);
if (result == null)
{
var response = new HttpResponseMessage(HttpStatusCode.NotAcceptable);
throw new HttpResponseException(response));
} return new HttpResponseMessage()
{
Content = new ObjectContent<Product>(
product, // What we are serializing
result.Formatter, // The media formatter
result.MediaType.MediaType // The MIME type
)
};
}
默认的Content Negotiator
DefaultContentNegotiator类是IContentNegotiator的默认实现,它使用以下标准选择formatter。
首先,这个类型必须能够序列化,这步验证通过MediaTypeFormatter.CanWriteType来实现
其次, content negotiator查看每个formatter并计算最与Http请求的formatter。匹配的原则如下:
- SupportedMediaTypes 集合中包括所有的被支持的media type, content negotiator 使用Accept header与这个集合匹配。
注意,Accept Header可以是一个范围。例如,“text/plain”是text/*或"/"的匹配项
- MediaTypeMappings 集合包含一系列的MediaTypeMappings 对象,它提供了http request与某种media type的匹配。如,
可以将自定义的Http Header与指定的media type对应
如果根据Accept Header没有找到合适的匹配项,ontent negotiator会尝试根据request body匹配media type。例如,如果请求包含JSON数据,content negotiator将使用 JSON formatter。
如果此时还没找到合适的匹配项,content negotiator会使用第一个可以序列化这个对象的formatter。
当formatter确定好后, content negotiator会查看这个formatter支持的SupportedEncodings ,并与 Accept-Charset header 进行匹配,查到最合适的 character encoding。
WebApi2官网学习记录---Content Negotiation的更多相关文章
- WebApi2官网学习记录---Configuring
Configuration Settings WebAPI中的configuration settings定义在HttpConfiguration中.有一下成员: DependencyResolver ...
- WebApi2官网学习记录---Cookie
Cookie的几个参数: Domain.Path.Expires.Max-Age 如果Expires与Max-Age都存在,Max-Age优先级高,如果都没有设置cookie会在会话结束后删除cook ...
- WebApi2官网学习记录---批量处理HTTP Message
原文:Batching Handler for ASP.NET Web API 自定义实现HttpMessageHandler public class BatchHandler : HttpMess ...
- WebApi2官网学习记录---Html Form Data
HTML Forms概述 <form action="api/values" method="post"> 默认的method是GET,如果使用GE ...
- WebApi2官网学习记录--HTTP Message Handlers
Message Handlers是一个接收HTTP Request返回HTTP Response的类,继承自HttpMessageHandler 通常,一些列的message handler被链接到一 ...
- WebApi2官网学习记录---单元测试
如果没有对应的web api模板,首先使用nuget进行安装 例子1: ProductController 是以硬编码的方式使用StoreAppContext类的实例,可以使用依赖注入模式,在外部指定 ...
- WebApi2官网学习记录---异常处理
HttpResponseException 当WebAPI的控制器抛出一个未捕获的异常时,默认情况下,大多数异常被转为status code为500的http response即服务端错误. Http ...
- WebApi2官网学习记录---BSON
BSON 是轻量级的,能够进行快速查询和高效的解码/编码.BSON方便查询是由于elements的前面都有一个表示长度的字段,所以解释器可以快速跳过这个elements:高效的解码/编码是因为nume ...
- WebApi2官网学习记录---JSON与XML的序列化
JSON序列化: WebAPI的默认序列库使用的是Json.NET,可以在Globally中配置使用DataContractJsonSerializer 进行序列化 protected void Ap ...
随机推荐
- RecycleView 瀑布流滑动移位
RecycleView StaggeredLayoutManager(瀑布流)滑动的时候,默认会出现item移动的问题,需以下来个步骤来解决: 附上StaggeredLayoutManager中的一段 ...
- x++ and ++x
http://blog.sina.com.cn/s/blog_6c762bb30101ar1w.html 看到个东西,搞不清的时候可以看看 =.=
- DOM4J 解析 XML
1.在项目根目录下新建lib文件夹 2.把dom4j文件拷贝到lib文件夹 3.dom4j,右键Build Path---->Add To Build Path 这样就添加dom4j到项目成功 ...
- 近期Responsive web design项目经验分享-高分辨率图片处理篇
在高分辨率的情况下 商品的图片难免会失真 怎样才能让商品的图片在高分辨率的情况下 效果不失真 提供用户更好的体验呢 我发现了一个解决方案 不知道是不是你想要的 先上图片对比下效果 左侧是使用后 ...
- Edusoho 的 Arale validator使用说明
1.js控制器文件开端 var Validator = require('bootstrap.validator'); require('common/validator-rules').inject ...
- PHP根据概率产生随机数
假设 有四个选项:a 占 10%,b占20% ,C占30% , d 占 40% ,原理就是现获取随机数,然后找区间.当然了,选项的数量可以任意.目前默认是 总和是 100% .如果需要别的数,修改 随 ...
- python生成html文件浏览器中文显示乱码问题
近来在网上采集数据,想把采集下来的数据整合成html的形式保存.以便其他的平台产品可以直接读取html显示或者根据html标签提取数据. def output_html(self): try: fou ...
- 比如在vi中按ctrl+z
比如在vi中按ctrl+z有个命令可以恢复会话,我忘了,大家谁记得? 分享到: 对我有用[0] 丢个板砖[0] 引用 | 举报| 编辑 删除 管理 回复次数:8 hellwolf hellwo ...
- iOS中设置导航栏标题的字体颜色和大小
iOS中设置导航栏标题的字体颜色和大小,有需要的朋友可以参考下. 在平时开发项目的时候,难免会遇到修改导航栏字体大小和颜色的需求,一般使用自定义视图的方法,其实还存在一种方法. 方法一:(自定义视图的 ...
- 搭建rac对单实例的MAA
一:实验环境 系统:redhat 4 三台计算机rac1,rac2,dg. --其中rac为主库,单实例为备库 已在虚拟机里搭建好集群环境(rac1,rac2); dg计算机里还没有建任何数据库(只安 ...