在ASP中检测额外字段.. NET Web API请求

本文关键字:NET Web API 请求 字段 ASP 检测 | 更新日期: 2023-09-27 18:11:35

我一直试图从这个链接得到的例子工作。

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

我有:

ApiController:

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

DynamicObject:

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;
    }
}

如果我从Fiddler发送Json

{“FirstName”:”Test”, “LastName”:”Test”, “City”:”New York”}

TrySetMember方法应该触发,它应该将bool ContainsExtra设置为true,这样它就可以在MyClassController的Add方法中进行评估。当它确实包含一个额外的字段时,它应该向客户端返回一个错误。

不幸的是,我似乎无法让TrySetMember触发。

我错过了什么?

在ASP中检测额外字段.. NET Web API请求

通过简单地将JSONMediaTypeFormatter的MissingMemberHandling设置为MissingMemberHandling,我获得了我想要的功能。错误,在我的例子中是I:

WebConfigFile:

// 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);
        }
    }
}

最后在WebConfigFile:

添加过滤器
// Add Validate Model Filter Attribute 
config.Filters.Add(new ValidateModelFilterAttribute());