Я использую 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);
}
}
Спасибо.