У меня есть класс промежуточного ПО OWIN, чтобы выполнить некоторую аутентификацию на основе некоторых пользовательских токенов. Все работает нормально. Однако я хотел бы вернуть полезный ответ об ошибке клиенту. Мое рассуждение состоит в том, что если клиент попросил ответ «application/json», и они ожидают объект сериализации, то это то, что они должны получить, даже если это код состояния 401.Возврат исключений из промежуточного ПО OWIN
Вот раздел Invoke моего промежуточного слоя:
public override async Task Invoke(IOwinContext context)
{
try
{
this.DoAuthorization(context);
await this.Next.Invoke(context);
}
catch (UnauthorizedAccessException ex)
{
this.GenerateErrorResult(context, HttpStatusCode.Unauthorized, this.ExceptionToString(ex));
}
catch (Exception ex)
{
this.GenerateErrorResult(context, HttpStatusCode.InternalServerError, this.ExceptionToString(ex));
}
}
private void GenerateErrorResult(IOwinContext context, HttpStatusCode code, string errorMessage)
{
var result = new Result { Status = Result.EStatus.Error, ErrorText = errorMessage };
context.Response.StatusCode = (int)code;
context.Response.ContentType = "application/json";
context.Response.Write(JsonConvert.SerializeObject(result));
}
Это все работает отлично, однако:
- является ли это 'правильный' путь?
- , что если клиент запрашивает «приложения/XML», который, очевидно, Web API вполне способен поддерживать
Есть ли лучший способ вернуть пользовательский объект ответа («Результат» в моем случае), что сериализуется так, как ожидал клиент?
Этот ответ может помочь вам: http://stackoverflow.com/questions/30918649/unhandled-exception-global-handler-for -owin-katana –
Выглядит как полезный трюк, но я до сих пор не вижу, как использовать IOwinContext для автоматической сериализации объекта ответа (без ручной сериализации с JsonConvert и т. д.). Контроллерам просто нужно вернуть объект, который структура будет сериализована для json или xml. Почему это не может быть промежуточным? – Paul
Я считаю, вы должны сериализовать его самостоятельно, поскольку промежуточное ПО owin выходит за рамки webapi. –