2017-09-06 4 views
1

ich binden mit der Einstellung Status-Code, um eine schöne und einfache API zu erhalten und die Dokumentation von Prahlerei (swashbuckle)Set Status-Code und Inhalt in WebAPI

Zuerst mein Controller erhalten sah wie folgt aus:

public class ValuesController : ControllerBase 
{ 
    [SwaggerResponse(HttpStatusCode.OK, Type = typeof(List<Value>))] 
    [HttpGet, System.Web.Mvc.Route("api/values/")] 
    public async Task<List<Value>> GetValues(HttpRequestMessage request) 
    { 
     using (DatabaseContext context = new DatabaseContext()) 
     { 
      return await context.Values.Take(10).ToListAsync(); 
     } 
    } 
} 

Alles in Ordnung, Swagger zeigt das Ergebnis JSON-formatiert. Problem ist, ich kann den Statuscode nicht setzen (zB wenn ich einen Datenbankfehler auf Err 500 oder s.th. Setzen könnte).

Here ich lesen, für einen Statuscode einstellen müssen wir ich geändert meinen Code ein HttpResponseMessage

So zurückzukehren:

public class ValuesController : ControllerBase 
{ 
    [SwaggerResponse(HttpStatusCode.OK, Type = typeof(HttpResponseMessage))] 
    [HttpGet, System.Web.Mvc.Route("api/values/")] 
    public async Task<HttpResponseMessage> GetValues(HttpRequestMessage request) 
    { 
     using (DatabaseContext context = new DatabaseContext()) 
     { 
      var valuesToReturn = await context.Values.Take(10).ToListAsync(); 
      return request.CreateResponse(HttpStatusCode.NotModified, valuesToReturn); 
     } 
    } 
} 

Nun wird der Statuscode richtig eingestellt, aber Prahlerei nicht Zeige irgendein Ergebnis.

enter image description here

So, dachte ich, das vielleicht ein Prahlerei-Problem.

nächste Schritt war die API mit Chromes Boomerang-Plugin zu testen, aber gleich: Statuscode 304 ist, aber der Körper (Ergebnis/content) leer:

enter image description here

Es ist definitiv Ergebnis: enter image description here

Haben Sie eine Idee, wie Sie den Körper richtig mit der HttpResponseMessage einstellen? Oder irgendeine Idee, wie man den Statuscode in der API-Methode setzt, wenn der Rückgabewert z.B. List<Value>?

Antwort

3

Zunächst wird der HTTP-Statuscode 304 nichtKörper hat. Die 304 Antwort darf keinen Nachrichtentext enthalten und wird daher immer durch die erste leere Zeile nach den Headerfeldern beendet.

Ändern Sie einfach den Statuscode.

+0

Ja das war auch ein Problem. –

+0

@MatthiasBurger das ist das Hauptproblem;) siehe meinen Kommentar zu meiner Antwort –

+0

@its_time_for_weekend verdammt Sie beide haben Recht. habe gerade deine Lösung mit 304 getestet und es hat nicht funktioniert. Großartig, habe heute etwas gelernt. –

0
var valuesToReturn = new List<string>(); 
valuesToReturn.Add("test01"); 
var res = new HttpResponseMessage() 
{ 
    Content = new StringContent(JsonConvert.SerializeObject(valuesToReturn), Encoding.UTF8, "application/json"), 
    StatusCode = HttpStatusCode.Redirect 
}; 
return res; 
+0

danke, aber Serialisierung ist keine Option. Imho, es kann nicht die richtige Lösung sein, Json.Net hier zu verwenden. Auch 'text/html' ist falsch. Das Rückgabeformat ist json, nicht html. –

+0

Sie können dies versuchen. Sie müssen lediglich den Inhaltstyp in "application/json" ändern. –

1

Rawitas Krungkaews Antwort ist teilweise richtig.

Aber Sie sollten die generische ObjectContent statt StringContent verwenden:

var res = new HttpResponseMessage() 
{ 
    Content = new ObjectContent<List<Value>>(valuesToReturn, DefaultJsonFormatter), 
    StatusCode = HttpStatusCode.Redirect 
}; 
return res; 

Der Parameter Default ist die MediaTypeFormatter. Ich denke, dass Sie es in Ihrer Klasse erklären kann wie:

private static readonly MediaTypeFormatter DefaultJsonFormatter 
    = new JsonMediaTypeFormatter(); 
+0

Das funktioniert perfekt. Aber immer noch keine Ahnung, warum 'CreateResponse' nicht funktioniert hat. –

+0

Erraten Sie, dass der 'HttpStatusCode', den Sie einstellen wollten, nicht der richtige ist. Werfen Sie einen Blick auf die Dokumentation von 'HttpStatusCode.NotModified':' Der Inhalt der Ressource wird nicht übertragen'. Wenn alles funktioniert und Sie Daten zurückgeben, geben Sie einfach einen 'HttpStatusCode.OK: "OK zeigt an, dass die Anfrage erfolgreich war und dass die angeforderten Informationen in der Antwort enthalten sind" - es ist nicht nötig, jemandem Bescheid zu sagen, bei der Anforderung eines GET wurde nichts geändert. Und siehe, ich habe den Statuscode (kopiert von Rawitas Antwort) in 'Redirect' geändert. Vielleicht hat es funktioniert wegen dieser –

Verwandte Themen