2014-04-11 13 views
28

Mam projekt Web API i prawo moje metody zawsze zwraca HttpResponseMessage.Web API Najlepsze podejście do zwrotu HttpResponseMessage

Więc, czy to działa czy nie wrócę:

bez błędów:

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

Każdy błąd lub nie

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

Kiedy wrócę obiektu potem użyj:

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

chciałbym wiedzieć jak mogę wrócić do mojego klienta HTML5 lepiej obudowane respose, więc mogę wrócić więcej informacji o transakcji, itp

myślałem o tworzeniu niestandardowej klasy, które mogą hermetyzacji HttpResponseMessage, ale mają też więcej danych.

Czy ktoś wdrożył coś podobnego?

+0

Nie należy używać żadnej zawartości w HttpStatusCode.NoContent. – kappadoky

+0

Ogólnie, jeśli zwrócisz HttpActionResult z 'HttpStatusCode.NoContent', to będzie - zaskoczyć - nie zwróci żadnej zawartości, nawet jeśli przekazujesz ciąg jak w powyższym przykładzie. Może być zaskakującym błędem. Podobnie jak odpowiedź użytkownika BigTone poniżej. To ma również sens, zgodnie ze specyfikacją https://httpstatuses.com/204 'Odpowiedź 204 jest kończona przez pierwszą pustą linię za polami nagłówka, ponieważ nie może zawierać treści wiadomości." – mmcrae

Odpowiedz

32

Chociaż nie jest to bezpośrednio odpowiedź na pytanie, chciałem podać pewne informacje, które uznałem za użyteczne. http://weblogs.asp.net/dwahlin/archive/2013/11/11/new-features-in-asp-net-web-api-2-part-i.aspx

HttpResponseMessage został mniej lub bardziej zastąpiony przez IHttpActionResult. Jest o wiele czystszy i łatwiejszy w użyciu.

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

Następnie można zamknąć, aby utworzyć niestandardowe. How to set custom headers when using IHttpActionResult?

Nie znalazłem jeszcze potrzeby wdrożenia niestandardowego wyniku, ale kiedy to zrobię, wybiorę tę trasę.

Jest to prawdopodobnie bardzo podobne do używania starego.

Aby dalej się rozwinąć i podać nieco więcej informacji. Możesz również dołączyć wiadomości z niektórymi żądaniami. Na przykład.

return BadRequest("Custom Message Here"); 

Nie możesz tego zrobić z wieloma innymi, ale pomagasz w przesyłaniu typowych wiadomości, które chcesz wysłać.

+2

Dzięki tobie, nigdy nie będę ponownie używaj przerażającego HttpResponseMessage – LastTribunal

4

Możesz zwrócić odpowiedź błędu, aby podać więcej szczegółów.

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

Wrócimy:

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

Więcej szczegółów tutaj: http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx

Używam również http://en.wikipedia.org/wiki/List_of_HTTP_status_codes mi pomóc ustalić, co kod stanu HTTP do powrotu.

2

Jedna ważna uwaga: nie umieszczaj treści w 204 odpowiedziach! Nie tylko jest to sprzeczne ze specyfikacją HTTP, ale .NET może faktycznie zachowywać się w nieoczekiwany sposób, jeśli to zrobisz.

Przez pomyłkę użyłem return Request.CreateResponse(HttpStatusCode.NoContent, null); i doprowadziło to do prawdziwego bólu głowy; przyszłe żądania z tej samej sesji zostaną przerwane z powodu posiadania wartości łańcuchowej "null" dołączonej do odpowiedzi. Wydaje mi się, że .NET nie zawsze całkowicie usuwa obiekt odpowiedzi dla wywołań API z tej samej sesji.

+0

Ogólnie, jeśli zwrócisz HttpActionResult za pomocą 'HttpStatusCode.NoContent', to będzie - niespodzianka - nie zwróci żadnej zawartości, nawet jeśli przekazujesz treść, jak w przypadku OP powyżej. Może być zaskakującym błędem. – mmcrae

Powiązane problemy