2014-04-11 8 views
28

Ich habe ein Web-API-Projekt und Recht meine Methoden gibt immer HttpResponseMessage.Web API Best Ansatz für die Rückkehr HttpResponseMessage

Also, wenn es funktioniert oder nicht ich zurück:

Keine Fehler:

return Request.CreateResponse(HttpStatusCode.OK,"File was processed."); 

Alle oder Fehler

return Request.CreateResponse(HttpStatusCode.NoContent, "The file has no content or rows to process."); 

fehl Wenn ich ein Objekt dann wieder ich verwenden:

return Request.CreateResponse(HttpStatusCode.OK, user); 

Ich mag würde wissen, wie kann ich zu meinem HTML5 Client zurückgeben besser gekapselt respose, so kann ich mehr Informationen über die Transaktion zurückgeben usw.

ich auf die Schaffung einer benutzerdefinierten Klasse dachte, dass die kapseln HttpResponseMessage hat aber auch mehr Daten.

Hat jemand etwas ähnliches implementiert?

+0

Sie sollten keinen Inhalt in einem HttpStatusCode.NoContent verwenden. – kappadoky

+0

Im Allgemeinen, wenn Sie ein HttpActionResult mit 'HttpStatusCode.NoContent' zurückgeben, wird es - Überraschung - keinen Inhalt zurückgeben, auch wenn Sie eine Zeichenfolge übergeben, wie in Ihrem Fall oben. Kann ein überraschender Bug sein. Wie die Antwort des Benutzers BigTone unten. Dies macht auch Sinn entsprechend der Spezifikation https://httpstatuses.com/204 'A 204 Antwort wird durch die erste leere Zeile nach den Header-Feldern beendet, weil es einen Nachrichtentext enthalten kann. – mmcrae

Antwort

32

Obwohl dies nicht direkt die Frage beantwortet, wollte ich einige Informationen zur Verfügung stellen, die ich nützlich fand. http://weblogs.asp.net/dwahlin/archive/2013/11/11/new-features-in-asp-net-web-api-2-part-i.aspx

Die HttpResponseMessage wurde mehr oder weniger durch IHttpActionResult ersetzt. Es ist viel sauberer und einfacher zu benutzen.

public IHttpActionResult Get() 
{ 
    Object obj = new Object(); 
    if (obj == null) 
     return NotFound(); 
    return Ok(obj); 
} 

Dann können Sie kapseln, um benutzerdefinierte zu erstellen. How to set custom headers when using IHttpActionResult?

Ich habe noch keine Notwendigkeit gefunden, ein benutzerdefiniertes Ergebnis zu implementieren, aber wenn ich es tue, werde ich diesen Weg gehen.

Es ist wahrscheinlich sehr ähnlich zu tun mit dem alten auch.

Um weiter zu erweitern und ein wenig mehr Informationen zur Verfügung stellen. Sie können auch Nachrichten mit einigen der Anfragen einschließen. Zum Beispiel.

Sie können dies nicht mit vielen der anderen tun, aber hilft für allgemeine Nachrichten, die Sie zurücksenden möchten.

+2

Dank Ihnen werde ich nie Benutze die gefürchtete HttpResponseMessage erneut – LastTribunal

4

Sie können eine Fehlerantwort zurückgeben, um weitere Details zu erhalten.

public HttpResponseMessage Get() 
{ 
    HttpError myCustomError = new HttpError("The file has no content or rows to process.") { { "CustomErrorCode", 42 } }; 
    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, myCustomError); 
} 

Würde zurück:

{ 
    "Message": "The file has no content or rows to process.", 
    "CustomErrorCode": 42 
} 

Weitere Details hier: http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx

Ich benutze http://en.wikipedia.org/wiki/List_of_HTTP_status_codes auch mir zu helfen, festzustellen, welche HTTP-Statuscode zurück.

2

Ein wichtiger Hinweis: Inhalt nicht in 204 Antworten! Es ist nicht nur gegen die HTTP-Spezifikation, sondern .NET kann sich auch in unerwarteter Weise verhalten.

Ich versehentlich verwendet return Request.CreateResponse(HttpStatusCode.NoContent, null); und es führte zu einem echten Kopfschmerzen; zukünftige Anfragen aus derselben Sitzung würden aufgrund eines "null" Zeichenfolgenwerts, der der Antwort vorangestellt ist, unterbrochen. Ich denke, dass .NET das Antwortobjekt für API-Aufrufe aus derselben Sitzung nicht immer vollständig löscht.

+0

Wenn du ein HttpActionResult mit 'HttpStatusCode.NoContent' zurücksendest, wird es - überraschenderweise - keinen Inhalt zurückgeben, auch wenn du Inhalte wie im obigen Beispiel weiterleite. Kann ein überraschender Bug sein. – mmcrae