NET ApiController:使用[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);

或者从Attribute类继承并将其放在某个动作/控制器上

最新更新