生成数据注释

Posted

技术标签:

【中文标题】生成数据注释【英文标题】:Produces Data Annotation 【发布时间】:2016-07-16 19:29:37 【问题描述】:

我最近一直在学习 Web API,并计划使用它来提高我的 MVC 应用程序的可扩展性。不过,当我最终开始创建 Web API 控制器时,我发现了一个应用于控制器类的 [Produces("application/json")] 注释。我无法弄清楚该注释的作用。我希望控制器只接受 json 输入,那么这个标签对我有帮助吗?

【问题讨论】:

【参考方案1】:

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(不支持的媒体类型)。

希望这会有所帮助。

【讨论】:

是否可以将该配置应用于仅一个控制器? 我添加了有关 ConsumesAttribute 的新信息 - 我希望这能满足您的要求。 应该的。谢谢【参考方案2】:

是的,Produces 属性将响应限制为仅定义的类型。你可以通过这种方式使用属性添加多个。

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

ASP.NET Core 使用 JSON 的默认值。如果您还需要 xml,您还必须在 ConfigureServices 方法中指定 xml 格式化程序。

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

【讨论】:

以上是关于生成数据注释的主要内容,如果未能解决你的问题,请参考以下文章

EF生成实体自动添加数据库字段注释

Mybatis generator 生成domain字段带数据库注释

mybatis generator为实体类生成自定义注释(读取数据库字段的注释添加到实体类,不修改源码)

PowerDesigner生成数据库时的列中文注释乱码问题的设置方法

python 从注释数据(gff)生成wormbase vcf

EF6 根据数据库字段说明,生成字段注释