Zwracam NotFound IHttpActionResult
, gdy coś nie zostało znalezione w mojej akcji WebApi GET. Wraz z tą odpowiedzią chcę wysłać niestandardową wiadomość i / lub wiadomość o wyjątku (jeśli istnieje). Obecny ApiController
jest NotFound()
metoda nie zapewnia przeciążenie przekazać wiadomość.
Czy jest na to sposób? czy będę musiał napisać własny zwyczaj IHttpActionResult
?
c#
asp.net-web-api
http-status-code-404
httpresponse
Ajay Jadhav
źródło
źródło
Odpowiedzi:
Jeśli chcesz dostosować kształt wiadomości z odpowiedzią, musisz napisać własny wynik akcji.
Chcieliśmy udostępnić najczęstsze kształty wiadomości odpowiedzi od razu po wyjęciu z pudełka dla rzeczy takich jak proste puste błędy 404, ale chcieliśmy również, aby te wyniki były jak najprostsze; Jedną z głównych zalet używania wyników akcji jest to, że znacznie ułatwia to test jednostkowy metody akcji. Im więcej właściwości przypisujemy wynikom akcji, tym więcej rzeczy musi wziąć pod uwagę test jednostkowy, aby upewnić się, że metoda akcji działa zgodnie z oczekiwaniami.
Często chcę również mieć możliwość dostarczania niestandardowej wiadomości, więc nie krępuj się, aby zarejestrować błąd, abyśmy mogli rozważyć wsparcie tego działania w przyszłej wersji: https://aspnetwebstack.codeplex.com/workitem/list/advanced
Jedną fajną rzeczą w wynikach działania jest jednak to, że zawsze możesz dość łatwo napisać własne, jeśli chcesz zrobić coś nieco innego. Oto, jak możesz to zrobić w swoim przypadku (zakładając, że chcesz, aby komunikat o błędzie był tekstowy / zwykły; jeśli chcesz JSON, zrobiłbyś coś nieco innego z zawartością):
Następnie w swojej metodzie akcji możesz po prostu zrobić coś takiego:
Jeśli użyłeś niestandardowej klasy bazowej kontrolera (zamiast bezpośrednio dziedziczyć po ApiController), możesz również wyeliminować „this”. część (która jest niestety wymagana przy wywołaniu metody rozszerzenia):
źródło
Oto jednowierszowy zwracający IHttpActionResult NotFound z prostą wiadomością:
źródło
Możesz użyć,
ResponseMessageResult
jeśli chcesz:tak, jeśli potrzebujesz znacznie krótszych wersji, myślę, że musisz zaimplementować wynik działania niestandardowego.
źródło
Możesz użyć właściwości ReasonPhrase klasy HttpResponseMessage
źródło
Możesz utworzyć niestandardowy wynik negocjowanej zawartości zgodnie z sugestią d3m3t3er. Jednak odziedziczyłbym po. Ponadto, jeśli potrzebujesz go tylko do zwracania NotFound, nie musisz inicjować statusu http z konstruktora.
źródło
Rozwiązałem to, po prostu wyprowadzając
OkNegotiatedContentResult
i zastępując kod HTTP w wynikowym komunikacie odpowiedzi. Ta klasa umożliwia zwrócenie treści z dowolnym kodem odpowiedzi HTTP.źródło
Jeśli dziedziczysz z bazy
NegotitatedContentResult<T>
, jak wspomniano, i nie musisz przekształcać swojegocontent
(np. Chcesz tylko zwrócić ciąg znaków), nie musisz nadpisywaćExecuteAsync
metody.Wszystko, co musisz zrobić, to podać odpowiednią definicję typu i konstruktora, który powie bazie, który kod stanu HTTP ma zwrócić. Wszystko inne po prostu działa.
Oto przykłady dla obu
NotFound
iInternalServerError
:Następnie możesz utworzyć odpowiednie metody rozszerzające dla
ApiController
(lub zrobić to w klasie bazowej, jeśli taką masz):A potem działają tak samo, jak metody wbudowane. Możesz zadzwonić do istniejącego
NotFound()
lub możesz zadzwonić do nowego niestandardowegoNotFound(myErrorMessage)
.I oczywiście, można pozbyć się „zakodowane” typów łańcuchowych w definicjach Typ niestandardowy i pozostawić go rodzajowe, jeśli chcesz, ale wtedy może trzeba się martwić o
ExecuteAsync
rzeczy, w zależności od Państwa<T>
rzeczywistości.Można patrzeć na kod źródłowy dla
NegotiatedContentResult<T>
zobaczyć wszystko, co robi. Nie ma w tym wiele.źródło
Musiałem utworzyć
IHttpActionResult
instancję w treściIExceptionHandler
klasy, aby ustawićExceptionHandlerContext.Result
właściwość. Jednak chciałem też ustanowić zwyczajReasonPhrase
.Odkryłem, że
ResponseMessageResult
może owinąć plikHttpResponseMessage
(co umożliwia łatwe ustawienie ReasonPhrase).Na przykład:
źródło
Wiem, PO zapytał o tekst wiadomości, ale inną opcją, aby po prostu zwrócić 404, jest zwrócenie przez metodę IHttpActionResult i użycie funkcji StatusCode
źródło
W odpowiedziach brakuje małego problemu z historią programistów.
ApiController
Klasa wciąż odsłaniającNotFound()
metody, które programiści mogą wykorzystać. To spowodowałoby, że odpowiedź 404 zawierałaby niekontrolowaną treść wyniku.Przedstawiam tutaj kilka fragmentów kodu „ lepszej metody ApiController NotFound ”, która zapewni mniej podatną na błędy metodę, która nie wymaga od programistów znajomości „lepszego sposobu wysłania błędu 404”.
ApiController
nazwieApiController
NotFound
metodę, aby umożliwić programistom użycie pierwszego dostępnego interfejsu API[Obsolete("Use overload instead")]
protected NotFoundResult NotFound(string message)
, które chcesz zachęcićNegotiatedContentResult
. zobacz załączoną lepszą klasę NotFoundResult .źródło