MediaTypeFormatter提供了HTTP Request body data与.Net类型之间的无缝转换。

什么是MediaType

Media Type指的是HTTP header中的content-type,它定义了在HTTP Body中的数据的格式。Media Type也用于Http RequestHeader中的Accept头,表明改Request期望收到的Response的body的格式。

你可以使用标准的media type,比如application/json, application/xml。你也可以定义自己的media type.

什么是MediaTypeFormatter

MediaTypeFormatter用于在Http Body和.Net之间进行转换。

所有的MediaTypeFormatter都继承自抽象类MediaTypeFormatter

public abstract class MediaTypeFormatter
{    // propertiespublic Collection<MediaTypeHeaderValue> SupportedMediaTypes { get; private set; }public Collection<Encoding> SupportedEncodings { get; private set; }public Collection<MediaTypeMapping> MediaTypeMappings { get; private set; }// methodspublic virtual Task<object> ReadFromStreamAsync(Type type, Stream stream, HttpContentHeaders contentHeaders, IFormatterLogger formatterLogger){// to be overriden by base class
    }public virtual Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, TransportContext transportContext){// to be overriden by base class
    }public abstract bool CanReadType(Type type);public abstract bool CanWriteType(Type type);
}

要定义自己的MediaTypeFormatter,只需要实现上述抽象类即可。

这里有详细的例子

http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

怎么使用自定义的formatter

要把一个media type formatter加入Web API Pipeline,

public static void ConfigureApis(HttpConfiguration config)
{config.Formatters.Add(new ProductCsvFormatter());
}

什么时候Web API Framework会用到MediaTypeFormatter

我们前面说过,media type主要用于HTTP Request/Response header中的content-type,和HTTP Request header中的Accept。

HTTP Request/Response header中的content-type

当Web API接收到HTTP Request请求,并且需要读取body信息时(比如,使用FromBody属性),Web API会检查content-type的类型,然后使用已注册的formatter去deserialize。

HTTP Request header中的Accept

假设我们有一个Product类

    [DataContract(Name = "Product", Namespace = "http://www.azure.com")]public class Product{[DataMember]public int Id { get; set; }[DataMember]public string Name { get; set; }[DataMember]public string Category { get; set; }[DataMember]public decimal Price { get; set; }}

以及一个Web API的controller

public HttpResponseMessage Get()
{var product = new Product() { Id = 1, Name = "Gizmo", Category = "Widgets", Price = 1.99M };return Request.CreateResponse(HttpStatusCode.OK, product);
}

这个controller返回一个HttpResponseMessage对象,里面包含一个product。

此时,Web API会检查该Request的Header中Accept的内容,然后调用相应的formatter去序列号product对象。

我们可以使用fiddler发送以下request

User-Agent: Fiddler
Host: localhost:9664
Accept: application/xml

那么我们得到的response是

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/xml; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Sat, 18 Oct 2014 08:35:21 GMT
Content-Length: 187<Product xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.azure.com"><Category>Widgets</Category><Id>1</Id><Name>Gizmo</Name><Price>1.99</Price></Product>

注意Content-Type,以及body的格式。

如果我们发送以下request

User-Agent: Fiddler
Host: localhost:9664
Accept: application/json

我们得到的response是

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?YzpcdXNlcnNcZWR3YW5nXGRvY3VtZW50c1x2aXN1YWwgc3R1ZGlvIDIwMTNcUHJvamVjdHNcV2ViQXBwVGVzdFxXZWJBcHBUZXN0XGFwaVx2YWx1ZXM=?=
X-Powered-By: ASP.NET
Date: Sat, 18 Oct 2014 09:22:45 GMT
Content-Length: 57{"Id":1,"Name":"Gizmo","Category":"Widgets","Price":1.99}

Web API使用XmlMediaTypeFormatter处理xml media type。XmlMediaTypeFormatter默认使用DataContractSerializer进行序列化。

使用JsonMediaTypeFormatter处理json media type。JsonMediaTypeFormatter默认使用Json.net进行序列化。

转载于:https://www.cnblogs.com/wangguangxin/p/4033384.html

ASP.NET Web API MediaTypeFormatter相关推荐

  1. ASP.NET Web API 应用教程(一) ——数据流使用

    相信已经有很多文章来介绍ASP.Net Web API 技术,本系列文章主要介绍如何使用数据流,HTTPS,以及可扩展的Web API 方面的技术,系列文章主要有三篇内容. 主要内容如下: I  数据 ...

  2. Asp.net Web Api开发 性能:使用Jil提升Json序列化性能

    from:http://blog.csdn.net/sqqyq/article/details/51692342 看了几篇网上关于各种序列化工具的性能对比,在这里再粘贴下: 我们使用了ASP.NET ...

  3. 使用Jil序列化JSON提升Asp.net web api 性能

    JSON序列化无疑是Asp.net web api 里面性能提升最重要的一环. 在Asp.net web api 里面我们可以插入自定义的MediaTypeFormatter(媒体格式化器), 说白了 ...

  4. Asp.net Web Api开发(第二篇)性能:使用Jil提升Json序列化性能

    看了几篇网上关于各种序列化工具的性能对比,在这里再粘贴下: 我们使用了ASP.NET WEB API来提供RESTfull风格的接口给APP调用,默认序列化库用的是:Newtonsoft.Json 为 ...

  5. 《ASP.NET Web API 2框架揭秘》

    <ASP.NET Web API 2框架揭秘> 基本信息 作者: 蒋金楠 出版社:电子工业出版社 ISBN:9787121235368 上架时间:2014-7-5 出版日期:2014 年7 ...

  6. (四)Asp.net web api中的坑-【api的返回值】

    (四)Asp.net web api中的坑-[api的返回值] 原文:(四)Asp.net web api中的坑-[api的返回值] void无返回值 IHttpActionResult HttpRe ...

  7. WCF 和 ASP.NET Web API

    地址:https://docs.microsoft.com/zh-cn/dotnet/framework/wcf/wcf-and-aspnet-web-api WCF 是 Microsoft 为生成面 ...

  8. ASP.NET Web API自身对CORS的支持:从实例开始

    在<通过扩展让ASP.NET Web API支持W3C的CORS规范>中我们通过自定义的HttpMessageHandler为ASP.NET Web API赋予了跨域资源共享的能力,具体来 ...

  9. ASP.NET Web API实践系列06, 在ASP.NET MVC 4 基础上增加使用ASP.NET WEB API

    本篇尝试在现有的ASP.NET MVC 4 项目上增加使用ASP.NET Web API. 新建项目,选择"ASP.NET MVC 4 Web应用程序". 选择"基本&q ...

最新文章

  1. 系统中常用操作基类(SSH项目中)非常非常经典的部分
  2. 黑马java代码04-05.docx
  3. 蒙特卡罗模拟法 —— python
  4. 不知道怎么用GitHub怎么当程序员?拿出十分钟,包你会
  5. Spring IoC反转控制的快速入门
  6. LeetCode2.两数相加
  7. Vue.js 作者尤雨溪:TypeScript 与 JavaScript 并行才切合实际!
  8. bat执行cmd命令_kettle定时任务pan.bat和kitchen.bat
  9. sap系统登录时没有服务器,SAP登录到SAP系统
  10. 公众号迁移开通留言功能
  11. 最简单代码画的五角星
  12. python画图颜色填充_【Python】Matplotlib画图(十一)——箱线图
  13. 手机CMWAP上网设置(完全版)
  14. 计算机专业对数学英语要求高吗,大学专科计算机专业对英语数学的要求高么
  15. Ubuntu18.04 MySQL+hive安装
  16. 曾谨言量子力学教程第3版笔记和课后答案
  17. VSTO Office二次开发键盘鼠标钩子使用整理
  18. VMware虚拟机——如何在VMware虚拟机环境下识别U盘
  19. 软件测试 Top 120 Blog (博客)
  20. MySQL数据库忘记密码之修改密码

热门文章

  1. oracle判断一个字符是否是数字
  2. node-mongo封装
  3. Windows核心编程 第27章 硬件输入模型和局部输入状态
  4. hdu4912 LCA+贪心
  5. 【Windows 逆向】OD 调试器工具 ( CE 工具通过查找访问的方式找到子弹数据基地址 | 使用 OD 工具附加游戏进程 | 在 OD 工具中查看子弹数据地址 | 推荐 )
  6. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 最简单用法 | 一行代码搞定权限申请 | 推荐用法 )
  7. 【计算机网络】传输层 : TCP 协议 ( TCP 协议特点 | TCP 报文段首部格式 | TCP 报文段控制位 )
  8. 【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )
  9. 【Android FFMPEG 开发】FFMPEG 交叉编译配置 ( 下载 | 配置脚本 | 输出路径 | 函数库配置 | 程序配置 | 组件配置 | 编码解码配置 | 交叉编译配置 | 最终脚本 )
  10. Autodesk布道GIS新理念