Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core ASP.NET核心-如何通过中间件知道反序列化失败_Asp.net Core - Fatal编程技术网

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您也可以装饰控制器,将其应用于所有方法。或者你可以让它适用于所有路线。我以前没见过那个电话!完美的再次非常感谢!