【问题标题】:How to prevent model state binding from altering the InputRequest in .NET C#如何防止模型状态绑定更改 .NET C# 中的 InputRequest
【发布时间】:2018-03-27 14:58:46
【问题描述】:

我有一个 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# 中实现它?

【问题讨论】:

    标签: c# asp.net api modelstate


    【解决方案1】:

    我可以通过从 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"));
                        }
    

    【讨论】:

      猜你喜欢
      • 2020-06-15
      • 2021-06-02
      • 1970-01-01
      • 2023-04-07
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多