我有一个带有可选主体(OrderRequest
(的HTTP端点:
[HttpPost]
public async Task<ActionResult> Index(OrderRequest? request = null)
{
//...
}
如果发送未指定Content-Type
标头的请求,则会出现415
(不支持的媒体类型(错误。
我可以做些什么来允许没有正文和媒体类型的请求?
当然,为了解决这个问题,我可以在客户端添加适当的媒体类型。但问题是,该端点的早期版本不需要任何请求体,因此也不需要媒体类型。因此,为了确保向后兼容性,我需要将此端点配置为能够像以前一样接受请求(没有请求主体和媒体类型(。
默认情况下,框架不允许POST请求具有空正文。您可以通过两种方式更改此行为:
- 全球。在这种情况下,在Program.cs中,将
.AddControllers()
更改为.AddControllers(opt => opt.AllowEmptyInputInBodyModelBinding = true)
- 仅此端点。在这种情况下,将方法声明更改为
Index([FromBody(EmptyBodyBehavior = EmptyBodyBehavior.Allow)] OrderRequest? request = null)
但是,此不会修复框架仅返回415不支持的媒体类型的问题。
我对此进行了深入研究,显然改变这种行为的方法之一是创建一个过滤器,就像这里所说的那样。
在他们讨论这种情况的aspnetcore存储库中存在GitHub问题。还有一个打开的pull请求来支持这种行为。
要解决这个问题,应该创建两个操作方法。第一个用于无正文的请求,第二个则相反。
之后,将Consumes
属性添加到第二个方法中。此属性筛选指定媒体类型的请求。因此,所有其他具有不同媒体类型或没有媒体类型的请求都将转到另一个操作方法。
[HttpPost]
public async Task<ActionResult> Index() => Index(null);
[HttpPost]
[Consumes("application/json")]
public async Task<ActionResult> Index(OrderRequest? request)
{
//...
}