C# 检测ASP.NET Web API请求中的额外字段

C# 检测ASP.NET Web API请求中的额外字段,c#,asp.net,json,C#,Asp.net,Json,我一直在尝试从链接中获取示例 我试图检测json请求中的额外字段,如果它们存在,则返回一个错误 以下是我所拥有的: ApiController: public class MyClassController : ApiController { public IHttpActionResult Add(MyClass myClass) { if (myClass.ContainsExtra) { return BadReque

我一直在尝试从链接中获取示例

我试图检测json请求中的额外字段,如果它们存在,则返回一个错误

以下是我所拥有的:

ApiController:

public class MyClassController : ApiController
{
    public IHttpActionResult Add(MyClass myClass)
    {
        if (myClass.ContainsExtra)
        {
            return BadRequest(ModelState);
        }
        ...
     }
...
}
动态对象:

public class MyClass : DynamicObject
{
    private Dictionary<string, object> fields =
                        new Dictionary<string, object>(
                             StringComparer.OrdinalIgnoreCase);

    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    public bool ContainsExtra { get; private set; }

    [JsonIgnore]
    public Dictionary<string, object> Extra
    {
        get { return fields; }
    }

    public override bool TryGetMember(GetMemberBinder binder,
                                              out object value)
    {
        return fields.TryGetValue(binder.Name, out value);
    }

    public override bool TrySetMember(SetMemberBinder binder,
                                                  object value)
    {
        this.ContainsExtra = true;

        fields[binder.Name] = value;
        return true;
    }
}
TrySetMember方法应该激发,并且应该将bool ContainsExtra设置为true,以便可以在MyClassController上的Add方法中对其进行评估。当它确实包含一个额外的字段时,它应该向客户端返回一个错误

不幸的是,我似乎无法让TrySetMember开火


我错过了什么

我只需将JSONMediaTypeFormatter的MissingMemberHandling设置设置为MissingMemberHandling即可获得所需的功能。错误,在我的示例中,我:

网络配置文件:

// Set up The Json Media Type Formatter
var JsonMTF = new JsonMediaTypeFormatter
{
  SerializerSettings = { MissingMemberHandling = MissingMemberHandling.Error }
};

// Clear all formatters
config.Formatters.Clear();

// Add the JSON formatter
config.Formatters.Add(JsonMTF);
然后编写ActionFilterAttribute:

public class ValidateModelFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext filterContext)
    {
        if (!filterContext.ModelState.IsValid)
        {
            filterContext.Response = filterContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, filterContext.ModelState);
        }
    }
}
最后在网络配置文件中添加过滤器:

// Add Validate Model Filter Attribute 
config.Filters.Add(new ValidateModelFilterAttribute());

不是答案,只是在想这样做是否和“验证”会更简单?我发现SerializerSetting“MissingMemberHandling”,默认情况下它设置为忽略,我所做的是:var jsonFormatter=config.Formatters.OfType().ElementAtOrDefault(1);jsonFormatter.SerializerSettings.MissingMemberHandling=MissingMemberHandling.Error;现在,当有一个额外的字段时,它设置ModelState.IsValid==false,我可以将ModelState返回给客户机。唯一的问题是我无法找到一种方法让它为类{“Message”:“请求无效”,“ModelState”:{“myClass.City”:[“在类型为“myClass”的对象上找不到成员“City”。路径“City”,第1行,位置16.]}如果请求正文的额外参数无效,则此解决方案有效,例如:{“FirstName”:“Test”,“LastName”:“Test”,“City”:“newyork”}如果City是无效属性,则如果额外参数是有效属性,则此解决方案无效例如:{“FirstName”:“Test”,“LastName”:“Test”,“FirstName”:“Test1”}
// Add Validate Model Filter Attribute 
config.Filters.Add(new ValidateModelFilterAttribute());