Как настроить обработчик исключений в EmbedIO Web API - PullRequest
0 голосов
/ 05 ноября 2019

Я использую EmbedIO с модулем Web API.

Я хотел бы иметь обработчик исключений, который будет перехватывать все необработанные исключения и возвращать подходящий код ошибки HTTP в соответствии ск типу исключения. Тем не менее, не ясно, если это может быть достигнуто.

Класс WebModuleBase предоставляет свойство OnUnhandledException, которое может быть установлено в ExceptionHandlerCallback, но когда вызывается обратный вызов, код состояния ответауже установлено значение HttpStatusCode.InternalServerError, как указано в комментариях к коду .

Это не удобно, поскольку я хочу установить код ответа самостоятельно.

Выставки WebModuleBaseдругое свойство OnHttpException, для которого можно установить HttpExceptionHandlerCallback . Это может быть установлено в HttpExceptionHandler.DataResponse (ResponseSerializer.Json), который частично решает проблему.

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

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

По сути, что-то похожее на Фильтры исключений в ASP.NET Web API.

Вот код для настройкивеб-сервер:

var webApiModule = new WebApiModule("/api", ResponseSerializer.Json)
    .WithController<MyController>();
webApiModule.OnUnhandledException = ExceptionHandler.DataResponseForException();
webApiModule.OnHttpException = ExceptionHandler.DataResponseForHttpException();

WebServerEmbedded = new EmbedIO.WebServer(
    opt => opt
        .WithUrlPrefix(url)
        .WithMode(HttpListenerMode.EmbedIO))
        .WithModule(null, webApiModule);

Это делегаты, используемые для обработчиков исключений:

internal static class ExceptionHandler
{
    public static ExceptionHandlerCallback DataResponseForException()
    {
        return (context, exception) => ResponseSerializer.Json(context, exception.Message);
    }

    public static HttpExceptionHandlerCallback DataResponseForHttpException()
    {
        return (context, httpException) => ResponseSerializer.Json(context, httpException.Message);
    }
}

Спасибо.

...