Pracowałem z WebApi i przeniosłem się na WebApi2, gdzie Microsoft wprowadził nowy IHttpActionResult
interfejs, który wydaje się zalecany do użycia zamiast zwracania HttpResponseMessage
. Jestem zdezorientowany zaletami tego nowego interfejsu. Wydaje się, że głównie zapewnia PO LEKKO łatwiejszy sposób utworzenia HttpResponseMessage
.
Argumentowałbym, że jest to „abstrakcja ze względu na abstrakcję”. Czy coś brakuje? Jakie są rzeczywiste korzyści płynące z korzystania z tego nowego interfejsu oprócz oszczędzania linii kodu?
Stary sposób (WebApi):
public HttpResponseMessage Delete(int id)
{
var status = _Repository.DeleteCustomer(id);
if (status)
{
return new HttpResponseMessage(HttpStatusCode.OK);
}
else
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
}
Nowa droga (WebApi2):
public IHttpActionResult Delete(int id)
{
var status = _Repository.DeleteCustomer(id);
if (status)
{
//return new HttpResponseMessage(HttpStatusCode.OK);
return Ok();
}
else
{
//throw new HttpResponseException(HttpStatusCode.NotFound);
return NotFound();
}
}
c#
asp.net-web-api
httpresponse
Jason Roell
źródło
źródło
HttpResponseMessage
, otrzymałem odpowiedź w 9545 ms . * UżywającIHttpActionResult
otrzymałem tę samą odpowiedź w 294 ms .Odpowiedzi:
Możesz zdecydować, aby nie używać,
IHttpActionResult
ponieważ istniejący kod buduje takiHttpResponseMessage
, który nie pasuje do jednej z odpowiedzi w puszce. Możesz jednak dostosować sięHttpResponseMessage
doIHttpActionResult
korzystania z konserwowanej odpowiedzi programuResponseMessage
. Zajęło mi to trochę czasu, aby to rozgryźć, więc chciałem to opublikować, pokazując, że niekoniecznie musisz wybierać jedno lub drugie:Uwaga:
ResponseMessage
jest metodą klasy podstawowejApiController
, z której kontroler powinien dziedziczyć.źródło
ResponseMessage
iResponseMessageResult
są dwie różne rzeczy.ResponseMessage()
jest metodą, zApiController
której kontroler powinien dziedziczyć, a zatem jest tylko wywołaniem metody. Dlatego nienew
jest potrzebne żadne słowo kluczowe. Prawdopodobnie nie dziedziczyszApiController
lub jesteś w metodzie statycznej.ResponseMessageResult
jest rodzajem zwrotuResponseMessage()
.response = base.ResponseMessage(responseMsg)
aby wyjaśnić, że jest to metoda klasy podstawowej ApiControllerNadal możesz używać
HttpResponseMessage
. Ta zdolność nie zniknie. Czułam to samo co ty i szeroko argumentowałam z zespołem, że nie ma potrzeby dodatkowej abstrakcji. Pojawiło się kilka argumentów, aby spróbować uzasadnić jego istnienie, ale nic nie przekonało mnie, że warto.To znaczy, dopóki nie zobaczyłem tej próbki od Brada Wilsona . Jeśli konstruujesz
IHttpActionResult
klasy w sposób, który można połączyć w łańcuch, zyskujesz możliwość stworzenia potoku odpowiedzi „na poziomie akcji” do wygenerowaniaHttpResponseMessage
.ActionFilters
Jednak pod przykrywkami jest to realizowane, ale ich kolejnośćActionFilters
nie jest oczywista podczas czytania metody akcji, co jest jednym z powodów, dla których nie jestem fanem filtrów akcji.Jednak tworząc metodę,
IHttpActionResult
która może być wyraźnie powiązana w metodzie działania, możesz skomponować różne zachowania, aby wygenerować odpowiedź.źródło
Oto kilka korzyści
IHttpActionResult
ponadHttpResponseMessage
wymienione w Microsoft ASP.NET Dokumentacja :IHttpActionResult
Warto jednak wspomnieć o kilku innych zaletach używania :Ok
NotFound
Exception
Unauthorized
BadRequest
Conflict
Redirect
InvalidModelState
( link do pełnej listy )ExecuteAsync
metody.ResponseMessageResult ResponseMessage(HttpResponseMessage response)
do konwersji HttpResponseMessage na IHttpActionResult .źródło
źródło
To tylko moja osobista opinia i ludzie z zespołu API mogą prawdopodobnie lepiej to wyrazić, ale oto mój 2c.
Przede wszystkim myślę, że nie jest to kwestia jednego nad drugim. Możesz użyć ich obu w zależności od tego, co chcesz zrobić w metodzie działania, ale aby zrozumieć prawdziwą moc
IHttpActionResult
, prawdopodobnie będziesz musiał wyjść poza te wygodne metody pomocnicze,ApiController
takie jakOk
:NotFound
itpZasadniczo myślę, że klasa wdrażająca
IHttpActionResult
jako fabrykaHttpResponseMessage
. Po takim nastawieniu staje się teraz przedmiotem, który należy zwrócić, i fabryką, która go wytwarza. W ogólnym sensie programowania możesz w niektórych przypadkach sam stworzyć obiekt, aw niektórych przypadkach potrzebujesz fabryki, aby to zrobić. To samo tutaj.Jeśli chcesz zwrócić odpowiedź, która musi zostać zbudowana za pomocą złożonej logiki, powiedzmy, wiele nagłówków odpowiedzi itp., Możesz wyodrębnić całą tę logikę do implementacji klasy wyników akcji
IHttpActionResult
i użyć jej w wielu metodach akcji, aby zwrócić odpowiedź.Kolejną zaletą używania
IHttpActionResult
jako typu zwracanego jest to, że sprawia, że metoda akcji ASP.NET Web API jest podobna do MVC. Możesz zwrócić dowolny wynik akcji, nie wpadając w formaty mediów.Oczywiście, jak zauważył Darrel, możesz łączyć wyniki działań i tworzyć potężny mikroprocesor podobny do samych programów obsługi komunikatów w potoku API. Będzie to potrzebne w zależności od złożoności metody działania.
Krótko mówiąc - to nie jest
IHttpActionResult
kontraHttpResponseMessage
. Zasadniczo tak właśnie chcesz utworzyć odpowiedź. Zrób to sam lub przez fabrykę.źródło
ResponseFactory.CreateOkResponse()
zwracana funkcja HttpResponseMessage, i nie musiałem zajmować się sprawami asynchronicznymi podczas tworzenia odpowiedzi. Jeden z członków zespołu wspomniał, że asynchronizacja może być przydatna, jeśli konieczne jest wykonanie operacji we / wy w celu wygenerowania wartości nagłówka. Nie jestem jednak pewien, jak często to się zdarza.Web API zasadzie powrotu 4 Typ obiektu:
void
,HttpResponseMessage
,IHttpActionResult
oraz inne silne typy. Zwraca pierwszą wersję interfejsu API sieci Web,HttpResponseMessage
która jest dość prostym komunikatem odpowiedzi HTTP.IHttpActionResult
Wprowadził WebAPI 2, który jest w rodzaju opasaniaHttpResponseMessage
. ZawieraExecuteAsync()
metodę tworzeniaHttpResponseMessage
. Upraszcza testowanie jednostkowe kontrolera.Innym typem zwracanym są rodzaj silnie typowanych klas serializowanych przez interfejs API sieci Web przy użyciu formatera multimediów w treści odpowiedzi. Wadą jest to, że nie można bezpośrednio zwrócić kodu błędu, takiego jak 404. Wszystko, co możesz zrobić, to zgłosić
HttpResponseException
błąd.źródło
Wolę zaimplementować funkcję interfejsu TaskExecuteAsync dla IHttpActionResult. Coś jak:
, gdzie _request to HttpRequest, a _respContent to ładunek.
źródło
Mamy następujące zalety korzystania z
IHttpActionResult
ponadHttpResponseMessage
:IHttpActionResult
, koncentrujemy się tylko na przesyłanych danych, a nie na kodzie statusu. Więc tutaj kod będzie czystszy i bardzo łatwy w utrzymaniu.async
iawait
domyślnie.źródło