c# - 如果有效负载包含意外字段,如何返回 BadRequest

标签 c# asp.net-core json.net

我正在尝试进行 PATCH 操作,如果请求正文包含契约(Contract)中未指定的字段,则该操作应该会失败。例如,如果我调用此方法:

[HttpPatch("{id}")]
public async Task<ActionResult> PatchResource(
    [FromRoute][Required] Guid id,
    [FromBody][Required] PatchRequest request) {/* whatever */}

PatchRequest 在哪里

public class PatchRequest
{
    public string Name { get; }
    public string Address { get; }
    public PatchRequest(string name, string address) { Name = name; Address = address; }
}

如果我得到这样的请求正文,我想返回 400(错误请求),可能还有解释

{
  "name": "Adam",
  "address" "NY City",
  "additional": true
}

我想回去

400 (Bad Request) - Didn't expect property 'additional'

我知道如果我在 PatchRequest 上设置自定义序列化程序并将 MissingMemberHandling 设置为 Error 我可以轻松获得 500(内部服务器错误) 在这种情况下通过抛出异常,但这没有意义,因为这里的错误是请求,而不是服务器。

最佳答案

在您的 PatchRequest 模型中,添加一个 JsonExtensionsData 属性

public class PatchRequest
{
    public string Name { get; }
    public string Address { get; }
    public PatchRequest(string name, string address) { Name = name; Address = address; }

    // extra fields
    [JsonExtensionData]
    private IDictionary<string, JToken> _extraStuff;
}

然后在您的 Controller 中,如果 _extraStuff 不为空,您将收到其他字段。

关于c# - 如果有效负载包含意外字段,如何返回 BadRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57413022/

相关文章:

c# - Powershell:GetType() 打印所有类型信息,但缺少很多?

c# - 将 JSON 字符串反序列化为当前类

c# - 循环 DataTable 或更多数据库调用哪个更有效?

c# - 在自定义模型 Binder 中的模型上设置 PropertyInfo 类型的属性时执行时间长

c# - 制作 IEndpointRouteBuilder 的扩展方法的正确方法是什么

c# - ASP.NET Core 修改/替换请求体

c# - JSON反序列化。

c# - Json.Net - 序列化不带引号的属性名称

c# - 我是否应该*始终*支持 C# 3.0 中的隐式类型局部变量?

c# - 从单个 WebApi 方法提供多个二进制文件的最佳方式是什么?