Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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# ASP.NET Core 1.0异常过滤器可以';我不能让它返回404_C#_Exception Handling_Custom Attributes_Asp.net Core 1.0 - Fatal编程技术网

C# ASP.NET Core 1.0异常过滤器可以';我不能让它返回404

C# ASP.NET Core 1.0异常过滤器可以';我不能让它返回404,c#,exception-handling,custom-attributes,asp.net-core-1.0,C#,Exception Handling,Custom Attributes,Asp.net Core 1.0,我一直试图通过简单地返回404来让异常过滤器工作。不幸的是,它似乎根本没有返回404,而是抛出500 API控制器: [HttpGet("{id}")] [ItemNotFoundExceptionFilter] public async Task<IActionResult> Get(int id) { var _service = new CustomExeptionService(); _service.ThrowItemNotFoundException();

我一直试图通过简单地返回404来让异常过滤器工作。不幸的是,它似乎根本没有返回404,而是抛出500

API控制器:

[HttpGet("{id}")]
[ItemNotFoundExceptionFilter]
public async Task<IActionResult> Get(int id)
{
    var _service = new CustomExeptionService();
    _service.ThrowItemNotFoundException();
    return Ok();
}
异常筛选器属性:

public class ItemNotFoundExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        HandleCustomException(context);
        base.OnException(context);
    }

    private void HandleCustomException(ExceptionContext context)
    {
        if (context.Exception.GetType() == typeof(ItemNotFoundException))
        {
            context.HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound;
        }
    }
}

来看看MVC 6不存在HttpResponseException

David Fowlers回应:


未处理的异常从管道中流出。您必须编写自己的中间件来处理它们。

我今天也遇到了同样的问题。如果你清除了异常,我认为你的代码会工作的。例如:

    public override void OnException(ExceptionContext context)
    {
        if (context.Exception.GetType() == typeof(TokenExpiredException))
        {
            context.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            context.Exception = null;
        }

        base.OnException(context);
    }

如果在
OnException
方法中放置断点,是否调用过它?是的,确实调用过OnException。事实上,HandleCustomException也会被调用,它确实会进入if
context.HttpContext.Response.StatusCode
也被正确设置为404,但在我通过web的响应中,我仍然看到500而不是404。
    public override void OnException(ExceptionContext context)
    {
        if (context.Exception.GetType() == typeof(TokenExpiredException))
        {
            context.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            context.Exception = null;
        }

        base.OnException(context);
    }