asp.net core http delete `FromBody` 如果没有内容类型头,则忽略

我在 httpDELETE请求中使用正文。我知道目前在删除中有一个正文是非标准的(但允许)。

使用HttpClient不允许删除请求的正文时会出现问题。我知道我可以只使用SendAsync,但我宁愿让我的 API 更灵活。

我希望这个机构是可选的。从某种意义上说,如果 asp.net core 无法确定内容类型,则忽略它。目前,asp.net 核心返回 415,即使没有发送正文(通过HttpClient- 所以内容长度应该为 0)。

可以FromBody这样扩展吗?或者我需要在管道中使用一些自定义逻辑?


富国沪深
浏览 392回答 3
3回答

侃侃尔雅

您可以创建在检查内容类型的模型绑定之前执行的 ResourceFilter:public class AddMissingContentType : Attribute, IResourceFilter{&nbsp; &nbsp; public void OnResourceExecuting(ResourceExecutingContext context)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; context.HttpContext.Request.Headers["Content-Type"] = "application/json";&nbsp; &nbsp; }&nbsp; &nbsp; public void OnResourceExecuted(ResourceExecutedContext context)&nbsp; &nbsp; {&nbsp; &nbsp; }}并将其添加到您的方法中:[AddMissingContentType][HttpDelete]public async Task<IActionResult> Delete([FromBody]RequestData request){}

回首忆惘然

如果您将 ~app 用作代理、负载平衡器或其他您无法控制的东西背后的 API,也许可以将其转换为 POST...示例:一些负载均衡器可以将主体的 DELETE 方法视为格式错误。但是,如果您对自己未来的环境有把握,为什么不...编辑:答案是:即使有可能,也许最好遵循有时适用的规则,有时不要再有任何意外。(--无法评论我是新出生的用户)。

小怪兽爱吃肉

一种解决方案是在控制器方法中手动获取主体。您可以检查内容类型是否存在,或者仅使用默认读取器(例如 json),然后以这种方式将其转换为您的模型。那么你不需要修改任何请求头[HttpDelete]public async Task Delete(){&nbsp; &nbsp; using (StreamReader reader = new StreamReader(request.Body, encoding))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var bodyContent = await reader.ReadToEndAsync();&nbsp; &nbsp; &nbsp; &nbsp; if(!String.IsNullOrEmpty(bodyContent))&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //mapp the bodyContent to your model&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; //perform the logic which should allways be done}注意:重要的是在方法签名中省略 FromBody 参数,否则当内容类型或正文丢失时绑定将失败
打开App,查看更多内容
随时随地看视频慕课网APP