Web Api 中返回JSON的正確作法

在使用Web Api的時候,有時候只想返回JSON;實現這一功能有多種方法,本文提供兩種方式,一種傳統的,一種做者認爲是正確的方法。web

JSON in Web API – the formatter based approachjson

只支持JSON最廣泛的作法是:首先清除其餘全部的formatters,而後只保留JsonMediaTypeFormatterapi

有了HttpConfiguration的實例,你將會很簡單的清除全部formatters,而後從新添加JsonMediaTypeFormatterapp

實現代碼以下:spa

configuration.Formatters.Clear();
configuration.Formatters.Add(new JsonMediaTypeFormatter());

這種方式雖然能夠實現功能,可是全部的conent negotiation仍是會發生,這就會產生如下額外的開銷了。由於,你已經知道要返回的結果了,也只想返回Json,其餘的content negotiation都不須要了。code

下面的方法能夠很好的解決這個問題。orm

 

JSON in Web API – the conneg based approachblog

最好的方法是使用自定義的只返回Json Resultcontent negotiation代替Web Api中默認的content negotiationget

Conneg經過實現IContentNegotiatorNegotiator方法實現擴展。Negotiator方法返回ContentNegotiationResult(它包裝了你選擇的headersformatter)。io

下面的方法經過傳遞一個JsonMediaTypeFormatter給自定義的conneg negotiator,讓它一直返回applicaton/json content-type以及JsonMediaTypeFormatter。這種方法避免了每次請求都要從新建立一次formatter

代碼以下:

public class JsonContentNegotiator : IContentNegotiator
{
    private readonly JsonMediaTypeFormatter _jsonFormatter;

    public JsonContentNegotiator(JsonMediaTypeFormatter formatter) 
    {
        _jsonFormatter = formatter;    
    }

    public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
    {
        var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));
        return result;
    }
}

接下來,你須要在HttpConfiguration實例上註冊你的新的實現機制:

 

var jsonFormatter = new JsonMediaTypeFormatter();
//optional: set serializer settings here
config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));

 

經過替換默認的DefaultContentNegotiator,咱們使用咱們自定義的JsonContentNegotiator,它只支持Json,並且能夠立刻返回。

若是你想更深刻的瞭解Content Negotiation的知識,你能夠查看做者的這篇文章

總結

經過使用自定義的JsonContentNegotiator替換系統默認的DefaultContentNegotiator,很好的實現Web Api只返回Json的功能,並且沒有額外的開銷。

 

 

原文地址:http://www.strathweb.com/2013/06/supporting-only-json-in-asp-net-web-api-the-right-way/

 

做者對Content Negotiation的講解:http://www.strathweb.com/2012/07/everything-you-want-to-know-about-asp-net-web-api-content-negotation/

相關文章
相關標籤/搜索