Как получается, что пользовательский ExceptionHandler
никогда не вызывается, и вместо этого возвращается стандартный ответ (а не тот, который я хочу)?
Зарегистрировано как это
config.Services.Add(typeof(IExceptionLogger), new ElmahExceptionLogger());
config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler());
и реализован следующим образом
public class GlobalExceptionHandler : ExceptionHandler
{
public override void Handle(ExceptionHandlerContext context)
{
context.Result = new ExceptionResponse
{
statusCode = context.Exception is SecurityException ? HttpStatusCode.Unauthorized : HttpStatusCode.InternalServerError,
message = "An internal exception occurred. We'll take care of it.",
request = context.Request
};
}
}
public class ExceptionResponse : IHttpActionResult
{
public HttpStatusCode statusCode { get; set; }
public string message { get; set; }
public HttpRequestMessage request { get; set; }
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var response = new HttpResponseMessage(statusCode);
response.RequestMessage = request;
response.Content = new StringContent(message);
return Task.FromResult(response);
}
}
и выбрасывается таким образом (тест)
throw new NullReferenceException("testerror");
в контроллере или в репозитории.
UPDATE
У меня нет другого ExceptionFilter
.
Я нашел триггер для этого поведения:
Указанный URL
GET http://localhost:XXXXX/template/lock/someId
отправка этого заголовка, мой ExceptionHandler
работает
Host: localhost:XXXXX
отправка этого заголовка, он не работает, и встроенный обработчик вместо этого возвращает ошибку
Host: localhost:XXXXX
Origin: http://localhost:YYYY
Это может быть проблема с запросами CORS (я использую пакет WebPAP CORS по всему миру с помощью подстановочных знаков) или, в конечном счете, мой регистратор ELMAH. Это также происходит при размещении на Azure (веб-сайтах), хотя встроенный обработчик ошибок отличается.
Любая идея, как это исправить?