.NET ApiController:使用 [FromBody] T 自定义模型绑定行为

.NET ApiController: Custom model binding behaviour using [FromBody] T

我使用以下代码反序列化 MyModel

的一个实例
      public async Task<IHttpActionResult> DoSomething([FromBody] MyModel model)

class MyModel {
string a;
int b;
}

是否可以强制执行更严格的模型绑定,以便后续输入不起作用?

{
"a":"someString",
"b": 4,
"c": "somethingIWantToCauseAnErrorWhenPresent"
}

您可以编写自己的 ActionFilter 来查找请求正文并根据您的逻辑抛出异常

public class CustomValidationFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            var bodyLength = context.HttpContext.Request.Body.Length;

            var buffer = new byte[bodyLength];
            context.HttpContext.Request.EnableRewind();
            context.HttpContext.Request.Body.Position = 0;
            var streamReader = new StreamReader(context.HttpContext.Request.Body);//do not dispose this streamReader
            var requestBody = streamReader.ReadToEnd();

            var jsonBody = JsonConvert.DeserializeObject<JObject>(requestBody);

            if (jsonBody.Property("c") != null) // your custom validation
            {

            }

        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
        }
    }

或者你全局应用这个过滤器,整个API像这样(.net core 2.2):

            services.AddMvc(options => options.Filters.Add(typeof(CustomValidationFilter))).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

或者继承属性class放在某个action/controller