Возврат ошибок в веб-API

Я разрабатываю совершенно новый REST API с помощью ASP.NET Web API. Исходя из фона WCF, я чувствую себя привлекательным для создания "контрактов ошибок" для моего API.

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

В большинстве примеров, которые я нашел, есть строка, возвращаемая, как правило, путем исключения исключения HttpResponseException или, по крайней мере, для того, чтобы сделать процесс создания информационной строки ошибки более автоматизированной: Вернуть пользовательские объекты ошибок в веб-API

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

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

Так что я должен заставить свои "ошибки" в том же формате, что и ответы на проверку модели? Каковы лучшие практики здесь?

Наконец, мой API откроет параметры форматирования json, xml и буферов протокола. В результате мне действительно нужно убедиться, что моя стратегия не зависит от форматера.

Ответ 1

Я написал этот пост в блоге некоторое время назад о том, как Web API выполняет обработку ошибок:

http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx

Это должно помочь ответить на ваши вопросы. По сути, у вас есть два варианта:

  • Определите свой собственный класс для ответов об ошибках. В этом случае вы хотите, чтобы ваш класс мог быть сериализован как XML, JSON и т.д. Затем вы можете использовать Request.CreateResponse(statusCode, myErrorInstance) для отправки своих пользовательских ошибок. Вероятно, вам также нужен способ превратить недопустимые состояния модели в ваш конкретный тип ошибки.

  • Использовать тип ответа на ошибку веб-API: HttpError. HttpError по существу является Dictionary<string, object>, где вы добавляете свои собственные ключи и значения в HttpError. Преимущества много: ваши ошибки будут выглядеть как ошибки веб-API, вы знаете, что они работают со всеми форматировщиками, и вы можете избежать работы по определению преобразований из исключений и недопустимых состояний модели. Самый простой способ использования HttpError - вызов Request.CreateErrorResponse().

Ответ 2

Вы можете делать все, что захотите, в этих ситуациях. Лучший опыт для потребителя вашего веб-api - убедиться, что вы используете дружественные сообщения об ошибках, и в этом случае вы захотите сериализовать свои ошибки в хорошо отформатированные json-объекты. Следующее сообщение в блоге содержит некоторые варианты использования и решение, которое я придумал: Web Api, HttpError и поведение исключений