web-dev-qa-db-de.com

wie kann ich einen Json-Fehler in asp.net web api zurückgeben?

Ich möchte eine Json-Fehlermeldung zurückschicken, aber im Moment kann ich dies nicht im Json-Panel sehen:

string error = "An error just happened";
JsonResult jsonResult = new JsonResult
{
     Data = error,
     JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
response = Request.CreateResponse(HttpStatusCode.BadRequest, jsonResult.Data);

wie macht man das?

25
user603007

Ein paar Punkte:

Wenn Sie lediglich eine Fehlerantwort mit einer einfachen Fehlernachricht zurückgeben möchten, stellt die Web-API eine CreateErrorResponse-Methode zur Verfügung. Sie können also einfach folgendes tun:

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, 
                                   "An error just happened");

Dies führt zu der folgenden HTTP-Antwort (andere Header wurden aus Gründen der Kürze ausgelassen):

HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Content-Length: 36

{"Message":"An error just happened"}

Wenn Sie stattdessen ein benutzerdefiniertes Objekt zurückgeben möchten, verwenden Sie Request.CreateResponse wie Sie es tun, aber nicht die MVC JsonResult. Übergeben Sie Ihr Objekt stattdessen direkt an CreateResponse:

var myError = new
{
    Data = "An error just happened",
    OtherDetails = "foo bar baz"
};

return Request.CreateResponse(HttpStatusCode.BadRequest, myError);

Nehmen wir an, Sie tun dies, aber Sie erhalten JSON nicht vom Server zurück. Es ist wichtig zu wissen, dass das Web-API normalerweise die Aushandlung von Inhaltstypen verwendet, um zu bestimmen, welches Format beim Senden der Antwort verwendet werden soll. Das bedeutet, dass der Accept-Header betrachtet wird, der vom Client mit der Anforderung gesendet wurde. Wenn der Accept-Header beispielsweise application/xml enthält, gibt die Web-API XML zurück. Wenn der Header application/json enthält, wird JSON zurückgegeben. Sie sollten also prüfen, ob Ihr Client den richtigen Accept-Header sendet.

Es gibt jedoch Möglichkeiten, die Web-API dazu zu zwingen, Daten immer in einem bestimmten Format zurückzugeben, wenn Sie das wirklich wollen. Sie können dies auf der Methodenebene tun, indem Sie eine andere Überladung von CreateResponse verwenden, die auch den Inhaltstyp angibt:

return Request.CreateResponse(HttpStatusCode.BadRequest, myError, 
    new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"));

Alternativ können Sie den XML-Formatierer in Ihrer WebApiConfig-Datei ganz aus der Konfiguration entfernen:

config.Formatters.Remove(config.Formatters.XmlFormatter);

Dadurch wird die Web-API gezwungen, JSON immer zu verwenden, unabhängig davon, was der Client verlangt.

58
Brian Rogers

sie können JSON wie folgt zurückgeben, 

 return Request.CreateResponse<ResponseApiModel>(HttpStatusCode.BadRequest, response);

Ich empfehle die Verwendung von IHttpActionResult für den Rückgabetyp der Methode anstelle von HttpResponseMessage, wenn der Rückgabetyp der Methode api IHttpActionResult ist. du kannst gerne zurückkehren;

 return Content(HttpStatusCode.InternalServerError, response);

sie können auch den Link über die bewährte Methode der Fehlerrückgabe überprüfen. Insbesondere die Antwort von @Daniel Little ist sehr nützlich.

Ich weiß, dass die Antwort zu spät hinzugefügt wurde, aber vielleicht steht jemandem eine gute Rolle.

5
arslanaybars

JsonResult ist ein MVC-Konzept. Es funktioniert nicht in Web-API. Eine Möglichkeit, Json-Inhalt explizit zurückzugeben, ist die Verwendung der in dieser Antwort erstellten Klasse https://stackoverflow.com/a/20504951/6819

1
Darrel Miller

Fügen Sie config.Formatters.Remove hinzu (config.Formatters.XmlFormatter); Zeile in Ihrer WebApiConfig-Datei

0
Amit Nikam