ASP.NET Web API MediaTypeFormatter

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
{    // properties
    public Collection<MediaTypeHeaderValue> SupportedMediaTypes { get; private set; }

    public Collection<Encoding> SupportedEncodings { get; private set; }

    public Collection<MediaTypeMapping> MediaTypeMappings { get; private set; }

    // methods
    public 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进行序列化。

时间: 2024-11-05 12:32:05

ASP.NET Web API MediaTypeFormatter的相关文章

&quot;Asp.Net Web Api MediaTypeFormatter Error for x-www-formurlencoded data&quot; 解决方法

遇到标题中所说的问题原因是使用 jQuery AJAX 以 POST 方式调用 Asp.Net Web API .解决办法请看以下代码中有注释的部分. public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Formatters.Clear(); config.Formatters.Add( new JsonMediaTypeFormatter { Seri

ASP.NET Web API 2.1支持Binary JSON(Bson)

ASP.NET Web API 2.1内建支持XML.Json.Bson.form-urlencoded的MiME type,今天重点介绍下Bson. BSON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式.BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性. BSON主要会实现以下三点目标: 1.更快的遍历速度 对JSON格式来说,太大的JSON结构会导致数据遍历非常慢.在JSON中,

Asp.Net Web API 2第三课——.NET客户端调用Web API

Asp.Net Web API 导航 Asp.Net Web API第一课——入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web API第二课——CRUD操作http://www.cnblogs.com/aehyok/p/3434578.html 前言 本教程演示从一个控制台应用程序,使用HttpClient调用Web API.我们也将使用上一个教程中建立的Web API.你可以直接在http://www.cnblogs.com/

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

相信已经有很多文章来介绍ASP.Net Web API 技术,本系列文章主要介绍如何使用数据流,HTTPS,以及可扩展的Web API 方面的技术,系列文章主要有三篇内容. 主要内容如下: I  数据流 II 使用HTTPS III 可扩展的Web API 文档 项目环境要求 VS 2012(SP4)及以上, .Net 框架4.5.1 Nuget包,可在packages.config 文件中查寻 本文涉及的知识点 ActionFilter AuthorizationFilter Delegate

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

JSON序列化无疑是Asp.net web api 里面性能提升最重要的一环. 在Asp.net web api 里面我们可以插入自定义的MediaTypeFormatter(媒体格式化器), 说白了就是根据HTTP content-type application/json 来判断采用哪种媒体格式化器 具体实现,记得要引入Jil包 public class JilFormatter : MediaTypeFormatter { private readonly Options _jilOpti

通过扩展让ASP.NET Web API支持JSONP

同源策略(Same Origin Policy)的存在导致了"源"自A的脚本只能操作"同源"页面的DOM,"跨源"操作来源于B的页面将会被拒绝.同源策略以及跨域资源共享在大部分情况下针对的是Ajax请求.同源策略主要限制了通过XMLHttpRequest实现的Ajax请求,如果请求的是一个"异源"地址,浏览器将不允许读取返回的内容.JSONP是一种常用的解决跨域资源共享的解决方案,现在我们利用ASP.NET Web API自身

【ASP.NET Web API教程】2.4 创建Web API的帮助页面

参考页面: http://www.yuanjiaocheng.net/CSharp/csharprumenshili.html http://www.yuanjiaocheng.net/entity/mode-first.html http://www.yuanjiaocheng.net/entity/database-first.html http://www.yuanjiaocheng.net/entity/choose-development-approach.html http://ww

新作《ASP.NET Web API 2框架揭秘》开始全面接受预订

我觉得大部分人都是"眼球动物",他们关注的往往都是目光所及的东西.对于很多软件从业者来说,他们对看得见(具有UI界面)的应用抱有极大的热忱,但是对背后支撑整个应用的服务却显得较为冷漠.如果我们将整个"生态系统"比喻成海面上漂浮的冰山,我们所能看的到的只是露出水面的冰山一角,水面之下才是一个"庞然大物". 提到服务,我们自然想到Web Service.但是传统意义上的Web Service却有点名不副实,因为支撑它的其实不是Web而是SOAP,承载

ASP.NET Web API Model-ParameterBinding

ASP.NET Web API Model-ParameterBinding 前言 通过上个篇幅的学习了解Model绑定的基础知识,然而在ASP.NET Web API中Model绑定功能模块并不是被直接调用的,而是要通过本篇要介绍的内容ParameterBinding的一系列对象对其进行封装调用,通过本篇的学习之后也会大概的清楚在Web API中绑定会有哪几种方式. Model-ParameterBinding(对象篇) 在ASP.NET Web API中ParameterBinding代表着