Я возвращаю NotFound IHttpActionResult
, если что-то не найдено в моем действии GET WebApi. Вместе с этим ответом я хочу отправить собственное сообщение и / или сообщение об исключении (если есть). Тока ApiController
«ы NotFound()
способ не обеспечивает перегрузку , чтобы передать сообщение.
Есть ли способ сделать это? или мне придется писать свой кастом IHttpActionResult
?
c#
asp.net-web-api
http-status-code-404
httpresponse
Аджай Джадхав
источник
источник
Ответы:
Вам нужно будет написать собственный результат действия, если вы хотите настроить форму ответного сообщения.
Мы хотели предоставить наиболее распространенные формы ответных сообщений из коробки для таких вещей, как простые пустые сообщения 404, но мы также хотели, чтобы эти результаты были как можно более простыми; Одно из основных преимуществ использования результатов действий состоит в том, что они значительно упрощают модульное тестирование вашего метода действия. Чем больше свойств мы добавляем к результатам действия, тем больше вещей необходимо учитывать вашему модульному тесту, чтобы убедиться, что метод действия выполняет то, что вы ожидаете.
Мне часто нужна возможность предоставить собственное сообщение, поэтому не стесняйтесь регистрировать ошибку, чтобы мы рассмотрели возможность поддержки этого результата действия в будущей версии: https://aspnetwebstack.codeplex.com/workitem/list/advanced
Однако в результатах действий есть одна приятная вещь: вы всегда можете довольно легко написать свои собственные, если хотите сделать что-то немного другое. Вот как вы могли бы это сделать в своем случае (если вы хотите, чтобы сообщение об ошибке было в текстовом / обычном формате; если вам нужен JSON, вы бы сделали что-то немного другое с содержимым):
Затем в своем методе действия вы можете просто сделать что-то вроде этого:
Если вы использовали базовый класс настраиваемого контроллера (вместо прямого наследования от ApiController), вы также могли бы исключить «this». часть (которая, к сожалению, требуется при вызове метода расширения):
источник
Вот однострочный вариант для возврата IHttpActionResult NotFound с простым сообщением:
источник
Вы можете использовать,
ResponseMessageResult
если хотите:да, если вам нужны намного более короткие версии, я думаю, вам нужно реализовать свой собственный результат действия.
источник
Вы можете использовать свойство ReasonPhrase класса HttpResponseMessage
источник
Вы можете создать собственный согласованный результат контента, как предложено d3m3t3er. Однако я бы унаследовал от. Кроме того, если он нужен только для возврата NotFound, вам не нужно инициализировать статус http из конструктора.
источник
Я решил это, просто взяв
OkNegotiatedContentResult
и переопределив код HTTP в полученном ответном сообщении. Этот класс позволяет вам возвращать тело содержимого с любым кодом ответа HTTP.источник
Если вы наследуете от базы
NegotitatedContentResult<T>
, как уже упоминалось, и вам не нужно преобразовывать свойcontent
(например, вы просто хотите вернуть строку), вам не нужно переопределятьExecuteAsync
метод.Все, что вам нужно сделать, это предоставить соответствующее определение типа и конструктор, который сообщает базе, какой код состояния HTTP нужно вернуть. Все остальное просто работает.
Вот примеры для
NotFound
иInternalServerError
:А затем вы можете создать соответствующие методы расширения
ApiController
(или сделать это в базовом классе, если он у вас есть):И тогда они работают так же, как встроенные методы. Вы можете вызвать существующий
NotFound()
или новый пользовательскийNotFound(myErrorMessage)
.И, конечно же, вы можете избавиться от «жестко запрограммированных» строковых типов в определениях настраиваемых типов и оставить их универсальными, если хотите, но тогда вам, возможно, придется побеспокоиться о
ExecuteAsync
вещах, в зависимости от того, что у вас на<T>
самом деле.Вы можете просмотреть в исходный код для ,
NegotiatedContentResult<T>
чтобы увидеть все это делает. В этом нет ничего особенного.источник
Мне нужно было создать
IHttpActionResult
экземпляр в телеIExceptionHandler
класса, чтобы установитьExceptionHandlerContext.Result
свойство. Однако я также хотел установить customReasonPhrase
.Я обнаружил, что
ResponseMessageResult
можно обернуть aHttpResponseMessage
(что позволяет легко установить ReasonPhrase).Например:
источник
Я знаю, что PO запрашивает текст сообщения, но другой вариант просто вернуть 404 - заставить метод возвращать IHttpActionResult и использовать функцию StatusCode
источник
В ответах здесь отсутствует небольшая проблема с историей разработчика.
ApiController
Класс еще обнажаяNotFound()
метод , который разработчики могут использовать. Это приведет к тому, что ответ 404 будет содержать неконтролируемое тело результата.Я представляю здесь несколько частей кода « лучшего метода ApiController NotFound », который обеспечит метод , менее подверженный ошибкам, который не требует от разработчиков знания «лучшего способа отправки 404».
ApiController
вызываемогоApiController
NotFound
метод, чтобы разработчики могли использовать первый доступный API[Obsolete("Use overload instead")]
protected NotFoundResult NotFound(string message)
что вы хотите поощритьNegotiatedContentResult
. см. прилагаемый лучше класс NotFoundResult .источник