ASP.NET Web API MediaTypeFormatter

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   io   os   ar   使用   

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: FiddlerHost: localhost:9664Accept: application/xml

那麼我們得到的response是

HTTP/1.1 200 OKCache-Control: no-cachePragma: no-cacheContent-Type: application/xml; charset=utf-8Expires: -1Server: Microsoft-IIS/8.0X-AspNet-Version: 4.0.30319X-Powered-By: ASP.NETDate: Sat, 18 Oct 2014 08:35:21 GMTContent-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: FiddlerHost: localhost:9664Accept: application/json

 

我們得到的response是

HTTP/1.1 200 OKCache-Control: no-cachePragma: no-cacheContent-Type: application/json; charset=utf-8Expires: -1Server: Microsoft-IIS/8.0X-AspNet-Version: 4.0.30319X-SourceFiles: =?UTF-8?B?YzpcdXNlcnNcZWR3YW5nXGRvY3VtZW50c1x2aXN1YWwgc3R1ZGlvIDIwMTNcUHJvamVjdHNcV2ViQXBwVGVzdFxXZWJBcHBUZXN0XGFwaVx2YWx1ZXM=?=X-Powered-By: ASP.NETDate: Sat, 18 Oct 2014 09:22:45 GMTContent-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進行序列化。

 

ASP.NET Web API MediaTypeFormatter

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.