为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
富国沪深 2021-10-09 10:13:19
我在 httpDELETE请求中使用正文。我知道目前在删除中有一个正文是非标准的(但允许)。使用HttpClient不允许删除请求的正文时会出现问题。我知道我可以只使用SendAsync,但我宁愿让我的 API 更灵活。我希望这个机构是可选的。从某种意义上说,如果 asp.net core 无法确定内容类型,则忽略它。目前,asp.net 核心返回 415,即使没有发送正文(通过HttpClient- 所以内容长度应该为 0)。可以FromBody这样扩展吗?或者我需要在管道中使用一些自定义逻辑?
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

您可以创建在检查内容类型的模型绑定之前执行的 ResourceFilter:


public class AddMissingContentType : Attribute, IResourceFilter

{

    public void OnResourceExecuting(ResourceExecutingContext context)

    {

        context.HttpContext.Request.Headers["Content-Type"] = "application/json";

    }


    public void OnResourceExecuted(ResourceExecutedContext context)

    {

    }

}

并将其添加到您的方法中:


[AddMissingContentType]

[HttpDelete]

public async Task<IActionResult> Delete([FromBody]RequestData request)

{

}


查看完整回答
反对 回复 2021-10-09
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

如果您将 ~app 用作代理、负载平衡器或其他您无法控制的东西背后的 API,也许可以将其转换为 POST...

示例:一些负载均衡器可以将主体的 DELETE 方法视为格式错误。但是,如果您对自己未来的环境有把握,为什么不...

编辑:答案是:即使有可能,也许最好遵循有时适用的规则,有时不要再有任何意外。(--无法评论我是新出生的用户)。


查看完整回答
反对 回复 2021-10-09
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

一种解决方案是在控制器方法中手动获取主体。您可以检查内容类型是否存在,或者仅使用默认读取器(例如 json),然后以这种方式将其转换为您的模型。那么你不需要修改任何请求头


[HttpDelete]

public async Task Delete()

{

    using (StreamReader reader = new StreamReader(request.Body, encoding))

    {

        var bodyContent = await reader.ReadToEndAsync();

        if(!String.IsNullOrEmpty(bodyContent))

        {

            //mapp the bodyContent to your model

        }

    }

    //perform the logic which should allways be done

}

注意:重要的是在方法签名中省略 FromBody 参数,否则当内容类型或正文丢失时绑定将失败


查看完整回答
反对 回复 2021-10-09
  • 3 回答
  • 0 关注
  • 391 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信