Web ApiでJSONに戻る正しいやり方

4000 ワード

Web Apiを使用する場合、JSONに戻りたい場合があります.この機能を実現するには多くの方法があり,本論文では2つの方法を提供し,1つの伝統的な方法,1つの著者らが正しいと考えている方法を提供する.
JSON in Web API – the formatter based approach
JSONのみをサポートする最も一般的な方法は、まず他のすべてのformattersをクリアし、JsonMediaType Formatterのみを保持することです.
HttpConfigurationの例があれば、すべてのformattersを簡単にクリアし、JsonMediaTypeFormatterを再追加します.
実装コードは次のとおりです.
configuration.Formatters.Clear();

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

この方式は機能を実現することができるが、すべてのconent negotiationが発生し、以下の追加のオーバーヘッドが発生する.なぜなら、あなたはもう帰る結果を知っていて、Jsonに戻りたいだけで、他のcontent negotiationは必要ありません.
次の方法はこの問題をうまく解決することができる.
 
JSON in Web API – the conneg based approach
最善の方法は、Web Apiでデフォルトのcontent negotiationの代わりに、Json Resultのみを返すカスタムcontent negotiationを使用することです.
ConnegはIContentNegotiatorを実現するNegotiator法により拡張を実現する.NegotiatorメソッドはContentNegotiationResult(選択したheadersとformatterをパッケージしています)を返します.
次の方法は、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を置き換えることで、Jsonのみをサポートし、すぐに戻るカスタムJsonContentNegotiatorを使用します.
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/