Фильтр исключений ASP.NET Core 1.0 не может вернуть его 404

Я пытался заставить фильтр исключений работать, просто возвращая 404. К сожалению, он, похоже, вообще не возвращает 404, вместо этого он выбрасывает 500.

Контроллер API:

[HttpGet("{id}")]
[ItemNotFoundExceptionFilter]
public async Task<IActionResult> Get(int id)
{
    var _service = new CustomExeptionService();
    _service.ThrowItemNotFoundException();
    return Ok();
}

Таможенное обслуживание исключений:

public class CustomExeptionService
{
    public void ThrowItemNotFoundException()
    {
        throw new ItemNotFoundException("This is a custom Exception.");
    }
}

public class ItemNotFoundException : Exception
{
    public ItemNotFoundException(string message) : base(message) { }
    public ItemNotFoundException(string message, Exception ex) : base(message, ex) { }
}

Атрибут фильтра исключений:

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;
        }
    }
}

2 ответа

У меня была такая же проблема сегодня. Я думаю, что ваш код будет работать, если вы очистите исключение. Пример:

    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);
    }

Приходите, чтобы узнать, что HttpResponseException не существует для MVC 6.

Ответ Дэвида Фаулерса: https://twitter.com/YuvalItzchakov/status/614094855367581696

Необработанные исключения вытекают из конвейера. Вы должны написать свое собственное промежуточное программное обеспечение, чтобы делать то, что вы хотите с ними.

Другие вопросы по тегам