【问题标题】:Is there generic solution to prevent/avoid over posting in web api C#?是否有通用解决方案来防止/避免在 web api C# 中过度发布?
【发布时间】:2019-10-03 12:17:53
【问题描述】:

我正在使用 ASP.NET 核心 C# web api,我需要在其中找到并防止请求正文中的过度发布属性。

例如:

类:

public class MyClass 
{
 public string Name { get; set; }
 public string Department { get; set; }
}

我的控制器:

[HttpPost()]
public async Task<IActionResult> Post([FromBody]MyClass myClass )
{
...
return something..
}

我的请求正文:

{
"Name" : "Mage",
"Department" : "IT"
"TotalMarks": "445"
}

在这里,我传递了不在模型“MyClass”中的“TotalMarks”属性。在这种情况下,JSON 格式化程序会简单地忽略此值。 (XML 格式化程序也是如此。)

参考:https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api#data-annotations

但我想停止并返回模型验证错误,当 API 请求中传递了一些属性但那些不是实际模型时。那么是否有任何通用的解决方案来支持所有模型。

【问题讨论】:

  • This Q&A 状态,可以设置Json.net序列化器的MissingMemberHandling。但是我不确定 ASP.NET 使用哪个 Json 反序列化器,也不确定如何(或者如果可以)设置它

标签: c# asp.net-core asp.net-web-api2 model-validation


【解决方案1】:

我认为为了实现您的要求,您需要实现自己的绑定模型,这可能很棘手且容易出错。 如果用户发送未映射到您的模型的属性,则应该没有真正的问题。它只会被 json 序列化程序丢弃。

相反,您应该创建一个 Dto 模型,该模型将您不想暴露的域模型的任何属性隐藏起来。请参阅这篇关于防止过度发布的 MS 文章:https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-5.0&tabs=visual-studio#prevent-over-posting

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多