Возврат пользовательского кода состояния HTTP из конечной точки WebAPI 2
Я работаю над сервисом в WebAPI 2, а конечная точка возвращает IHttpActionResult
. Я хотел бы вернуть код состояния 422
, но поскольку он не включен в перечисление HttpStatusCode
, я не понимаю, как он будет отправлен, поскольку для всех конструкторов требуется параметр HttpStatusCode
Как сейчас, я возвращаю BadResult(message)
, но возврат сообщения 422
+ будет более наглядным и полезным для моих клиентов. Любые идеи?
Ответы
Ответ 1
В соответствии со спецификацией С#:
Набор значений, которые может принимать тип перечисления, не ограничен его членами перечисления. В частности, любое значение базового типа перечисления может быть перенесено в тип перечисления и является отдельным допустимым значением этого типа перечисления
Поэтому вы можете передать код статуса 422 в HttpStatusCode.
Пример контроллера:
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace CompanyName.Controllers.Api
{
[RoutePrefix("services/noop")]
[AllowAnonymous]
public class NoOpController : ApiController
{
[Route]
[HttpGet]
public IHttpActionResult GetNoop()
{
return new System.Web.Http.Results.ResponseMessageResult(
Request.CreateErrorResponse(
(HttpStatusCode)422,
new HttpError("Something goes wrong")
)
);
}
}
}
Ответ 2
return Content((HttpStatusCode) 422, whatEver);
кредит предназначен для: Возвращает контент с помощью IHttpActionResult для ответа не на OK
и ваш код должен быть <= 999
и, пожалуйста, игнорируйте коды от 100 до 200.
Ответ 3
Я использую этот способ простой и элегантный.
public ActionResult Validate(User user)
{
return new HttpStatusCodeResult((HttpStatusCode)500,
"My custom internal server error.");
}
Затем контроллер angular.
function errorCallBack(response) {
$scope.response = {
code: response.status,
text: response.statusText
}});
Надеюсь, это поможет вам.
Ответ 4
Для этого вам может понадобиться Атрибут фильтра действий. Ничего фантастического. Просто создайте класс и наследуйте его от класса ActionFilterAttribute
в С#. Затем переопределите метод с именем OnActionExecuting
для реализации этого. Тогда просто используйте этот фильтр на голове любого контроллера. Ниже приводится демо.
При условии, что в ActionFilterAttribute
необходимо создать собственный код на основе кода состояния, вы можете написать следующим образом:
if (necessity_to_send_custom_code)
{
actionContext.Response = actionContext.Request.CreateResponse((HttpStatusCode)855, "This is custom error message for you");
}
Надеюсь это поможет.
Ответ 5
Еще один упрощенный пример:
public class MyController : ApiController
{
public IHttpActionResult Get()
{
HttpStatusCode codeNotDefined = (HttpStatusCode)422;
return Content(codeNotDefined, "message to be sent in response body");
}
}
Content
- это виртуальный метод, определенный в абстрактном классе ApiController
, базе контроллера. См. объявление ниже:
protected internal virtual NegotiatedContentResult<T> Content<T>(HttpStatusCode statusCode, T value);