wake-up-neo.com

Benutzerdefinierten HTTP-Statuscode vom Web API 2-Endpunkt zurückgeben

Ich arbeite an einem Dienst in WebAPI 2 und der Endpunkt gibt derzeit ein IHttpActionResult zurück. Ich möchte einen Statuscode 422 Zurückgeben, aber da er nicht in der Aufzählung HttpStatusCode enthalten ist, weiß ich nicht, wie er gesendet werden soll, da alle Konstruktoren dies erfordern ein Parameter von HttpStatusCode

Gegenwärtig gebe ich BadResult(message) zurück, aber die Rückgabe einer 422 + - Nachricht wäre für meine Kunden aussagekräftiger und nützlicher. Irgendwelche Ideen?

44
Garrison Neely

Nach C # Spezifikation:

Die Menge der Werte, die ein Aufzählungstyp annehmen kann, ist nicht durch seine Aufzählungsmitglieder beschränkt. Insbesondere kann jeder Wert des zugrunde liegenden Typs einer Aufzählung in den Aufzählungstyp umgewandelt werden und ist ein eindeutiger gültiger Wert dieses Aufzählungstyps

Daher können Sie den Statuscode 422 in HttpStatusCode umwandeln.

Beispiel Controller:

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);

credit is for: Rückgabe von Inhalten mit IHttpActionResult bei Nicht-OK-Antwort

und Ihr Code muss <= 999 sein

bitte ignorieren Sie Codes zwischen 100 und 200.

22
peyman

Ich benutze diesen Weg einfach und elegant.

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

Dann angular Controller.

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

Hoffe es hilft dir.

3

Dazu müssen Sie möglicherweise ein Aktionsfilterattribut verwenden. Nichts Besonderes. Erstellen Sie einfach eine Klasse und erben Sie sie von der Klasse ActionFilterAttribute in c #. Überschreiben Sie anschließend eine Methode mit dem Namen OnActionExecuting, um dies zu implementieren. Dann verwenden Sie einfach diesen Filter auf dem Kopf eines Controllers. Es folgt eine Demo.

Unter der Bedingung, dass Sie in ActionFilterAttribute eine auf benutzerdefinierten Statuscode basierende Nachricht erstellen müssen, können Sie folgendermaßen schreiben:

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

Hoffe das hilft.

0
Sajeeb Chandan

Ein weiteres vereinfachtes Beispiel:

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

Content ist eine virtuelle Methode, die in der abstrakten Klasse ApiController, der Basis des Controllers, definiert ist. Siehe die Erklärung wie folgt:

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