Asp.net core ASP.NET核心-如何通过中间件知道反序列化失败
让我们假设以下代码:Asp.net core ASP.NET核心-如何通过中间件知道反序列化失败,asp.net-core,Asp.net Core,让我们假设以下代码: public class Test { public DateTime Date { get; set; } public string Title { get; set; } } [HttpPut, Route("test")] public IActionResult test([FromBody]Test Data) { .... } 如果用户在正文中提供的json无效,则数据将为空 有没有一种
public class Test
{
public DateTime Date { get; set; }
public string Title { get; set; }
}
[HttpPut, Route("test")]
public IActionResult test([FromBody]Test Data)
{
....
}
如果用户在正文中提供的json无效,则数据将为空
有没有一种方法可以在代码执行之前捕获它,这样我就不必在每个API方法上测试null
我认为它作为一个中间件是可行的,但我没有这方面的经验,所以我不确定。您可以使用MVC过滤器在执行操作时自动执行验证。引述: 您可以使用操作筛选器自动验证模型状态,并在状态无效时返回任何错误:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace FiltersSample.Filters
{
public class ValidateModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
context.Result = new BadRequestObjectResult(context.ModelState);
}
}
}
}
OnActionExecuted
方法在action方法之后运行,可以通过actionexecutecontext.Result
属性查看和操作操作的结果<代码>ActionExecuteContext.Cancelled如果操作执行被另一个筛选器短路,则将设置为true<代码>ActionExecuteContext。如果操作或后续操作筛选器引发异常,则异常将设置为非空值。将ActionExecutedContext.Exception
设置为null可有效地“处理”异常,然后执行ActionExecutedContext.Result
,就像它是从操作方法正常返回的一样
您应该验证模型数据。如果属性是必需的,您应该将它们标记为必需的,然后验证过程(
ModelState.IsValid
)将告诉您它是否正确。但这意味着我需要为每个调用添加一个“If(ModelState.IsValid)…”;我试图找到是否可以在管道中捕捉到这一点,并从单个位置返回一个通用错误实际上它并不像我预期的那样工作:这迫使我用一个属性来修饰每个调用;但是,由于我们有一个可以用很多方式使用的框架,我正在寻找一种完全自动的框架,任何人编写一个新的rest调用都不必考虑。@Thomas您也可以装饰控制器,将其应用于所有方法。或者你可以让它适用于所有路线。我以前没见过那个电话!完美的再次非常感谢!