web-dev-qa-db-fra.com

Renvoyer le code d'état HTTP personnalisé à partir du point de terminaison WebAPI 2

Je travaille sur un service dans WebAPI 2, et le point de terminaison renvoie actuellement un IHttpActionResult. Je voudrais retourner un code d'état 422, Mais comme il n'est pas dans l'énumération HttpStatusCode, je ne sais pas comment il serait envoyé, car tous les constructeurs ont besoin un paramètre de HttpStatusCode

Dans l'état actuel des choses, je retourne BadResult(message), mais retourner un message 422 + Serait plus descriptif et utile pour mes clients. Des idées?

44
Garrison Neely

Selon la spécification C #:

L'ensemble de valeurs qu'un type enum peut prendre n'est pas limité par ses membres enum. En particulier, toute valeur du type sous-jacent d'une énumération peut être convertie en type énumération et est une valeur valide distincte de ce type énumération

Par conséquent, vous pouvez convertir le code d'état 422 en HttpStatusCode.

Exemple de contrôleur:

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")
                )
            );
        }
    }
}
77
lilo.jacob
 return Content((HttpStatusCode) 422, whatEver);

le crédit est pour: renvoyer le contenu avec IHttpActionResult pour une réponse non OK

et votre code doit être <= 999

et veuillez ignorer les codes entre 100 et 200.

22
peyman

J'utilise cette façon simple et élégante.

public ActionResult Validate(User user)
{
     return new HttpStatusCodeResult((HttpStatusCode)500, 
               "My custom internal server error.");
}

Alors angular.

function errorCallBack(response) {            
$scope.response = {
   code: response.status,
   text: response.statusText
}});    

J'espère que cela vous aide.

3
Ricardo G Saraiva

Pour cela, vous devrez peut-être utiliser un attribut de filtre d'action. Rien d'extraordinaire. Créez simplement une classe et héritez-la de la classe ActionFilterAttribute en c #. Remplacez ensuite une méthode nommée OnActionExecuting pour l'implémenter. Ensuite, utilisez simplement ce filtre sur la tête de n'importe quel contrôleur. Voici une démo.

À condition que vous ayez besoin de produire un message basé sur un code d'état personnalisé dans ActionFilterAttribute, vous pouvez écrire de la manière suivante:

        if (necessity_to_send_custom_code)
        {
            actionContext.Response = actionContext.Request.CreateResponse((HttpStatusCode)855, "This is custom error message for you");
        }

J'espère que cela t'aides.

0
Sajeeb Chandan

Un autre exemple simplifié:

public class MyController : ApiController
{
    public IHttpActionResult Get()
    {
        HttpStatusCode codeNotDefined = (HttpStatusCode)422;
        return Content(codeNotDefined, "message to be sent in response body");
    }
}

Content est une méthode virtuelle définie dans la classe abstraite ApiController, la base du contrôleur. Voir la déclaration ci-dessous:

protected internal virtual NegotiatedContentResult<T> Content<T>(HttpStatusCode statusCode, T value);
0
themefield