Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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
C# 如何自动返回错误代码404未找到WEB API核心_C#_Http_.net Core_Asp.net Core Webapi_Http Status Codes - Fatal编程技术网

C# 如何自动返回错误代码404未找到WEB API核心

C# 如何自动返回错误代码404未找到WEB API核心,c#,http,.net-core,asp.net-core-webapi,http-status-codes,C#,Http,.net Core,Asp.net Core Webapi,Http Status Codes,嗨,我想知道,如果对象为空,有没有办法自动返回Not Found() 例如,本章的插图 User user = _userService.GetUserById(int id); if(user is null) return Not FOund(); return Ok(user); 我想这样做 User user = _userService.GetUserById(int id); return Ok(user); 并自动接收空对象和状态代码404。有什么方法可以实现这一点吗

嗨,我想知道,如果对象为空,有没有办法自动返回Not Found()

例如,本章的插图

User user = _userService.GetUserById(int id);

if(user is null)
  return Not FOund();

return Ok(user);
我想这样做

User user = _userService.GetUserById(int id);

return Ok(user);

并自动接收空对象和状态代码404。有什么方法可以实现这一点吗?

根据您的描述,我建议您可以尝试使用自定义过滤器来实现您的要求

您可以创建一个全局操作筛选器来检查OKobejctResult值,如果该值为null,则可以修改上下文结果

更多详细信息,请参考以下代码:

创建筛选器类:

public class TestActionFilter : IActionFilter
{
     
    public void OnActionExecuted(ActionExecutedContext context)
    {

        if (context.Result.GetType() == typeof(OkObjectResult))
        {
            if (((OkObjectResult)context.Result).Value == null)
            {
                context.Result = new NotFoundResult();
            }
        }

    }

    public void OnActionExecuting(ActionExecutingContext context)
    {

        //throw new NotImplementedException();
    }
}
在startup.cs ConfigureServices方法中注册它:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers(options => options.Filters.Add(typeof(TestActionFilter)));
    }
那么它就会很好地工作

我的测试控制器操作:

    [HttpPost]
    public IActionResult CreateImage(string base64image)
    {
        WeatherForecast ew = null;

        return Ok(ew);

    }
结果:


根据您的描述,我建议您可以尝试使用自定义过滤器来满足您的要求

您可以创建一个全局操作筛选器来检查OKobejctResult值,如果该值为null,则可以修改上下文结果

更多详细信息,请参考以下代码:

创建筛选器类:

public class TestActionFilter : IActionFilter
{
     
    public void OnActionExecuted(ActionExecutedContext context)
    {

        if (context.Result.GetType() == typeof(OkObjectResult))
        {
            if (((OkObjectResult)context.Result).Value == null)
            {
                context.Result = new NotFoundResult();
            }
        }

    }

    public void OnActionExecuting(ActionExecutingContext context)
    {

        //throw new NotImplementedException();
    }
}
在startup.cs ConfigureServices方法中注册它:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers(options => options.Filters.Add(typeof(TestActionFilter)));
    }
那么它就会很好地工作

我的测试控制器操作:

    [HttpPost]
    public IActionResult CreateImage(string base64image)
    {
        WeatherForecast ew = null;

        return Ok(ew);

    }
结果:


有更新吗?我的回答对你有帮助吗?我只是通过另一种方法来解决这个问题,创建中间件和自定义异常,比如NotFound。在我看来,过滤器比中间件更好,我们可以决定哪个控制器应该应用过滤器。如果使用中间件,则只能检查请求路径。是否有更新?我的回答对你有帮助吗?我只是通过另一种方法来解决这个问题,创建中间件和自定义异常,比如NotFound。在我看来,过滤器比中间件更好,我们可以决定哪个控制器应该应用过滤器。如果使用中间件,则只能检查请求路径。