我最近一直在学习Web API,并计划使用它来提高我的MVC应用程序的可伸缩性。但是,当我最终创建Web API控制器时,我发现应用于控制器类的[Produces("application/json")]
注释。我还没有弄清楚注释的作用。我希望控制器只接受json输入,这个标签对我有用吗?
答案 0 :(得分:9)
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(不支持的媒体类型)。
希望这有帮助。
答案 1 :(得分:1)
是的,Produces属性将响应限制为仅定义的类型。您可以通过这种方式使用属性添加多个。
[Produces("application/json", "application/xml")]
ASP.NET Core使用JSON的默认值。如果还需要xml,则还必须在ConfigureServices方法中指定xml格式化程序。
services.AddMvc()
.AddMvcOptions(o => o.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter()));