C# ASP.NET Core 2.0中的验证:语法与验证问题
在我的ASP.NET Core 2.0应用程序中,当输入中出现语法问题(例如格式错误的json)时,我想抛出一个C# ASP.NET Core 2.0中的验证:语法与验证问题,c#,asp.net-core,asp.net-core-2.0,C#,Asp.net Core,Asp.net Core 2.0,在我的ASP.NET Core 2.0应用程序中,当输入中出现语法问题(例如格式错误的json)时,我想抛出一个400错误请求,对于其他错误(例如必需的、StringLength等),我想抛出一个422不可处理的实体 有没有办法知道(可能是查看ModelState)是语法(400)问题还是验证问题(422) 这是我正在使用的控制器操作 [HttpPost] public async Task<IActionResult> CreateArticle([FromBody
400错误请求
,对于其他错误(例如必需的、StringLength等),我想抛出一个422不可处理的实体
有没有办法知道(可能是查看ModelState
)是语法(400
)问题还是验证问题(422
)
这是我正在使用的控制器操作
[HttpPost]
public async Task<IActionResult> CreateArticle([FromBody] CreateArticleInput input)
{
if(!ModelState.IsValid)
{
// Return 400 or 422
}
}
[HttpPost]
公共异步任务CreateArticle([FromBody]CreateArticleInput)
{
如果(!ModelState.IsValid)
{
//返回400或422
}
}
我不太确定你在问什么,听起来像是CreateArticleInput
可能是某种JSON输入,但我认为编写自己的自定义模型绑定器是一种方法。
然后,如果“原始”输入没有正确映射到您的CreateArticleInput
,您可以用任何方式处理它。
并可能从modelbinder返回以下内容
bindingContext.Result = ModelBindingResult.Failed();
return Task.CompletedTask;
然后
在控制器中,如果CreateArticleInput输入为空,则返回400
当出现语法错误/格式错误的有效负载时,模型绑定器将不会填充输入
参数。鉴于此,您可以检查input==null
。当不满足对象的要求时,ModelState.IsValid
将返回false
,您可以相应地返回HTTP 422
一些示例代码:
public class MyObj
{
[Required]
public string Foo { get; set; }
}
[HttpPost]
public IActionResult Post([FromBody]MyObj obj)
{
if (obj == null)
{
return BadRequest();
}
if (!ModelState.IsValid)
{
return UnprocessableEntity(ModelState);
}
return Ok();
}
发布无效/格式错误的有效负载时,obj
将null
并返回错误请求(HTTP 400)。当有效负载是正确的JSON,但Foo
属性是null
,ModelState.IsValid
将返回false
,这将导致HTTP 422结果和验证绑定错误。当一切正常时,它将返回一个200。根据您使用它的方式,您可以从HttpContext获取它
返回状态码(HttpContext.Response.StatusCode)代码>无法在型号活页夹级别上混合n匹配返回代码。即使是第三方解决方案,如FluentValidation,也只允许对失败的结果使用单一返回模式
正如人们所建议的那样,在控制器级别上添加一个额外的语法/语义检查,并保持输入验证的原样—更干净