Почему мой GlobalExceptionFilter не работает на NET.Core? - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь реализовать GlobalExceptionFilter в NET Core WEB API.Это мой код фильтра:

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

Есть идеи?спасибо!

ОБНОВЛЕНИЕ

Хорошо, я должен признать, что я считаю, что это не работало, потому что Почтальон показывает мне ошибку соединения вместо MethodNotAllowed из NotFound (404).Как и предполагалось, я проверяю отладку и ответ о состоянии, и на самом деле было ожидаемое значение.

1 Ответ

0 голосов
/ 23 сентября 2018

Как говорят документы (последний раздел)

Предпочитают промежуточное программное обеспечение для обработки исключений.Используйте фильтры исключений только там, где вам нужно по-разному обрабатывать ошибки в зависимости от того, какое действие MVC было выбрано.Например, в вашем приложении могут быть методы действия как для конечных точек API, так и для представлений / HTML.Конечные точки API могут возвращать информацию об ошибке в виде JSON, в то время как действия на основе представления могут возвращать страницу с ошибкой в ​​виде HTML.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...