首页 > 解决方案 > 为什么我的 GlobalExceptionFilter 不能在 NET.Core 上运行?

问题描述

我正在尝试在 NET Core WEB API 中实现 GlobalExceptionFilter。这是我的过滤器代码:

public class GlobalExceptionFilter : IExceptionFilter, IDisposable
{
    private readonly ILogger _logger;
    public GlobalExceptionFilter(ILoggerFactory logger)
    {
        if (logger == null)
        {
            throw new ArgumentNullException(nameof(logger));
        }

        this._logger = logger.CreateLogger("Global Exception Filter");
    }

    public void Dispose()
    {
    }

    public void OnException(ExceptionContext context)
    {
        Dictionary<string, string> data = new Dictionary<string, string>();
        HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
        String message = String.Empty;

        var ex = context.Exception;

        TypeSwitch.Do(ex,
                TypeSwitch.Case<ArgumentException>(() => { statusCode = HttpStatusCode.BadRequest; }),
                TypeSwitch.Case<ArgumentNullException>(() => { statusCode = HttpStatusCode.BadRequest; }),
                TypeSwitch.Case<ArgumentOutOfRangeException>(() => { statusCode = HttpStatusCode.BadRequest; }),
                TypeSwitch.Case<KeyNotFoundException>(() => { statusCode = HttpStatusCode.NotFound; }),
                TypeSwitch.Case<DivideByZeroException>(() => { statusCode = HttpStatusCode.MethodNotAllowed; }),
                TypeSwitch.Case<QueryFormatException>(() => { statusCode = HttpStatusCode.MethodNotAllowed; })
            );

        HttpResponse response = context.HttpContext.Response;
        response.StatusCode = (int)statusCode;
        response.ContentType = "application/json";
        var err = new ErrorPayload()
        {
            Data = data,
            StackTrace = ex.StackTrace,
            Message = ex.Message,
            StatusCode = (int)statusCode
        };
        response.WriteAsync(JsonConvert.SerializeObject(err));
    }
}

这是我的初始化代码

public void ConfigureServices(IServiceCollection services)
{
    services.AddApplicationInsightsTelemetry(Configuration);
    services.AddMvc( config =>
        {
            config.Filters.Add(typeof(GlobalExceptionFilter));                    
        }
    );
}

我正在测试这个控制器方法中的错误处理

[HttpGet("{idCliente}")]
public IActionResult GetCliente(int idCliente)
{
    throw new QueryFormatException("My Custom Exception");
}

有任何想法吗?谢谢!

更新

好吧,我不得不承认我认为这不起作用,因为 Postman 向我显示连接错误,而不是 NotFound (404) 的 MethodNotAllowed。正如建议的那样,我检查了调试和状态响应,实际上是预期值。

标签: c#asp.net-core

解决方案


正如文档所说(最后一部分)

首选中间件进行异常处理。仅在需要根据选择的 MVC 操作以不同方式进行错误处理的情况下使用异常过滤器。例如,您的应用程序可能具有 API 端点和视图/HTML 的操作方法。API 端点可以以 JSON 形式返回错误信息,而基于视图的操作可以以 HTML 形式返回错误页面。

在您的情况下,如果应用程序仅提供 API:s,那么请改用异常中间件实现。这是一个很好的例子


推荐阅读