如何防止模型状态绑定在.NET C#中更改InputRequest

时间:2018-03-27 14:58:47

标签: c# asp.net api modelstate

我有一个Web API(POST),它接受输入JSON并对其进行操作。由于模型状态绑定,默认情况下请求绑定到请求模型。

我们面临的情况是收到的JSON不符合预期的格式。就像我们有额外的键值对,我们想要识别并通知它。由于模型状态绑定,我无法找到其他参数。

我一直在尝试下面的代码,但我没有得到实际的请求。有没有办法获得实际请求而不是被覆盖的请求。

public override void OnActionExecuting(HttpActionContext actionContext)
{
    string uri = actionContext.Request.RequestUri.ToString();
    uri = uri.Substring(uri.LastIndexOf('/') + 1).ToLower();
    if(uri.Contains("xxx"))
    {
        PartnerLoginSchema reqSchema = new PartnerLoginSchema();
        JsonSchema schema = JsonSchema.Parse(reqSchema.schemaJson);
        var requestInput = actionContext.ActionArguments["requestx"];// receiving overriden request

        string valid = JsonConvert.SerializeObject(requestInput);
        JObject jsonObj= JObject.Parse(valid);
        bool testcheck = person.IsValid(schema);

    }
}

例如:预期的JSON

{
    req1: "asd",
    req2: "wer"
}

输入收到的JSON:

{
    req1:"asdf",
    req2:"werr",
    req3:"unwanted" // this attribute is not required and has to be identified 
}

我想通过某种方式找到JSON中存在的req3。

有没有办法在ASP.NET C#中实现它?

1 个答案:

答案 0 :(得分:0)

我可以通过从HttpContext.Current.Request.InputStream中读取输入JSON来实现它

JsonSerializerSettings settings = new JsonSerializerSettings();
                    settings.MissingMemberHandling = MissingMemberHandling.Error;
                    string req_txt;
                    using (StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream))
                    {
                        req_txt = reader.ReadToEnd();
                    }
                    try
                    {
                        ExpectedJsonFormat s =
                            JsonConvert.DeserializeObject<ExpectedJsonFormat>(req_txt,
                                settings); // throws expection when over-posting occurs
                    }
                    catch (Exception ex)
                    {
                        actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, BadAndUnAuthorisedRequest("extra column"));
                    }