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?
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")
)
);
}
}
}
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.
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.
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.
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);