web-dev-qa-db-ja.com

データ注釈を生成します

私は最近Web APIについて学び、それを使用してMVCアプリのスケーラビリティを向上させる計画を立てています。しかし、ようやくWeb APIコントローラーの作成に取り掛かったとき、コントローラークラスに[Produces("application/json")]アノテーションが適用されていることに気付きました。私はその注釈が何をするのか理解できませんでした。コントローラがjson入力のみを受け入れるようにしたいので、このタグは役に立ちますか?

13
Nick Fulton

ProducesAnnotationは、応答のフォーマットのみに影響します。したがって、これは入力を制限する必要がある場合には役立ちません。

ASP.NET Core MVCフレームワークのProducesAnnotationを使用して、コンテンツネゴシエーションプロセスを特定のタイプのコントローラーアクションまたは特定のアクションの出力に向けることができます。ドキュメントから( https://docs.asp.net/en/latest/mvc/models/formatting.html ):

特定のアクションのレスポンス形式を制限したい場合は、[Produces]フィルターを適用できます。

グローバルレベルで入力をjsonに制限する場合は、起動時にMVCを構成して、Startup.csにタイプJsonInputFormatterの単一のInputFormatterのみを含めることができます。

public void ConfigureServices(IServiceCollection services)
{
    ...    
    // Add framework services.
    services.AddMvc(config =>
    {
        // Add XML Content Negotiation
        config.RespectBrowserAcceptHeader = true;
        config.InputFormatters.Clear();
        config.InputFormatters.Add(new JsonInputFormatter());
    });
    ...
}

コントローラまたはアクションレベルでは、[Produces]に対応するのは[Consumes]アノテーションです。と

[Consumes("application/json")]
public class MyController : Controller
{
    public IActionResult MyAction([FromBody] CallModel model)
    {
        ....
    }
}

このコントローラーの呼び出しは、クライアントがapplication/jsonのContent-Typeヘッダーを提供する場合にのみ成功します。それ以外の場合は、415(サポートされていないメディアタイプ)が返されます。

お役に立てれば。

12
Ralf Bönning

はい、Produces属性は、定義されたタイプのみに応答を制限します。この方法で属性を使用すると、複数を追加できます。

[Produces("application/json", "application/xml")]

ASP.NET CoreはJSONのデフォルト値を使用します。 xmlも必要な場合は、ConfigureServicesメソッドでxmlフォーマッターも指定する必要があります。

services.AddMvc()
            .AddMvcOptions(o => o.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter()));
1
John C