Подтвердить что ты не робот

Возврат пользовательского кода состояния HTTP из конечной точки WebAPI 2

Я работаю над сервисом в WebAPI 2, а конечная точка возвращает IHttpActionResult. Я хотел бы вернуть код состояния 422, но поскольку он не включен в перечисление HttpStatusCode, я не понимаю, как он будет отправлен, поскольку для всех конструкторов требуется параметр HttpStatusCode

Как сейчас, я возвращаю BadResult(message), но возврат сообщения 422 + будет более наглядным и полезным для моих клиентов. Любые идеи?

4b9b3361

Ответ 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")
                )
            );
        }
    }
}

Ответ 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);