【问题标题】:Detecting Extra Fields in ASP.NET Web API Request检测 ASP.NET Web API 请求中的额外字段
【发布时间】:2014-07-04 00:39:06
【问题描述】:

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

我正在尝试检测 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;
    }
}

如果我从 Fiddler 发送这个 Json

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

TrySetMember 方法应该被触发,它应该将布尔值 ContainsExtra 设置为 true,以便可以在 MyClassController 上的 Add 方法中对其进行评估。当它确实包含一个额外的字段时,它应该向客户端返回一个错误。

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

我错过了什么?

【问题讨论】:

  • 不是答案,只是想accessing properties like this example 和“验证”这种方式会更简单吗?
  • 我找到了一个 SerializerSetting "MissingMemberHandling",默认设置为 Ignore,我所做的是:
  • var jsonFormatter = config.Formatters.OfType().ElementAtOrDefault(1); jsonFormatter.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error;
  • 现在它设置 ModelState.IsValid == false 当有一个额外的字段时,我可以将 ModelState 返回给客户端。唯一的问题是我想不出一种方法让它为类使用不同的名称 { "Message":"The request is invalid.", "ModelState":{ "myClass.City":[ "Could not find member 'myClass' 类型的对象上的 'City'。路径 'City',第 1 行,位置 16。 ] } }

标签: c# asp.net json


【解决方案1】:

我只需将 JSONMediaTypeFormatter 的 MissingMemberHandling 设置设置为 MissingMemberHandling.Error 即可获得我想要的功能,在我的例子中是:

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());

【讨论】:

  • 如果请求正文额外参数无效,则此解决方案有效,例如:{“FirstName”:“Test”,“LastName”:“Test”,“City”:“New York”} where city是无效属性 如果额外参数是有效属性则不起作用 Ex:{“FirstName”:”Test”, “LastName”:”Test”, “FirstName”:”Test1”}
猜你喜欢
  • 1970-01-01
  • 2021-07-23
  • 2019-07-09
  • 2016-06-30
  • 2013-07-14
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多