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を再追加します.
実装コードは次のとおりです.
この方式は機能を実現することができるが、すべての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を再作成することを回避します.
コードは次のとおりです.
次に、HttpConfigurationインスタンスに新しい実装メカニズムを登録する必要があります.
デフォルトの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/
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/