【发布时间】:2016-08-02 08:15:26
【问题描述】:
我想将我的一个(并且只有一个)控制器配置为只接受 application/xml 请求。
过去,我使用 IControllerConfiguration 来做到这一点,就像 here (Per-Controller configuration) 描述的那样。
我如何在 Aspnet Core 中做到这一点?
【问题讨论】:
标签: asp.net-core
我想将我的一个(并且只有一个)控制器配置为只接受 application/xml 请求。
过去,我使用 IControllerConfiguration 来做到这一点,就像 here (Per-Controller configuration) 描述的那样。
我如何在 Aspnet Core 中做到这一点?
【问题讨论】:
标签: asp.net-core
您可以将Consumes-Annotation 与Controller 或Action 级别上接受的内容类型一起使用。
有
[Consumes("application/xml")]
public class MyController : Controller
{
public IActionResult MyAction([FromBody] CallModel model)
{
....
}
}
只有当客户端提供 application/xml 的 Content-Type 标头时,对该控制器的调用才会成功。否则将返回 415(不支持的媒体类型)。
【讨论】:
您可以简单地检查 Request AcceptTypes / Content-Type 标头(如 if request.AcceptTypes.Contains("application/xml"))并停止请求处理。
根据您提供的链接,您似乎只想忽略内容类型并始终返回 XML 结果。在这种情况下,您可以使用新的Produces 属性。
指定操作将返回的预期 System.Type 和支持的响应内容类型的过滤器。 Microsoft.AspNetCore.Mvc.ProducesAttribute.ContentTypes 值用于设置 Microsoft.AspNetCore.Mvc.ObjectResult.ContentTypes。
将属性应用到您的控制器
[Produces("application/xml")]
public YourXmlController : Controller { }
或仅针对特定的控制器操作:
[Produces("application/xml")]
public Object ControllerAction()
{
return new { text = "hello world" };
}
注意,XML formatter 默认不启用,所以你应该使用 MvcOptions 添加一个:
services.Configure<MvcOptions>(options =>
{
//options.InputFormatters.Add( ... );
//options.OutputFormatters.Add( ... );
});
【讨论】:
services.AddMvc().AddXmlSerializerFormatters()github.com/aspnet/Mvc/blob/1.0.0/src/…