Ich habe mit WebApi entwickelt und bin zu WebApi2 übergegangen, wo Microsoft eine neue Benutzeroberfläche eingeführt hat IHttpActionResult
, die anscheinend empfohlen wird, über die Rückgabe von a HttpResponseMessage
. Ich bin verwirrt über die Vorteile dieser neuen Schnittstelle. Es scheint hauptsächlich nur eine etwas einfachere Möglichkeit zu bieten, eine zu erstellen HttpResponseMessage
.
Ich würde argumentieren, dass dies "Abstraktion um der Abstraktion willen" ist. Vermisse ich etwas Was sind die realen Vorteile, die ich durch die Verwendung dieser neuen Schnittstelle bekomme, außer vielleicht das Speichern einer Codezeile?
Alter Weg (WebApi):
public HttpResponseMessage Delete(int id)
{
var status = _Repository.DeleteCustomer(id);
if (status)
{
return new HttpResponseMessage(HttpStatusCode.OK);
}
else
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
}
Neuer Weg (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
quelle
quelle
HttpResponseMessage
ich die Antwort in 9545 ms zurückerhalten . * Mit dem habeIHttpActionResult
ich die gleiche Antwort in 294 ms zurückbekommen .Antworten:
Sie können sich entscheiden, diese nicht zu verwenden,
IHttpActionResult
da Ihr vorhandener Code eine erstelltHttpResponseMessage
, die nicht zu einer der vordefinierten Antworten passt. Sie können sich jedochHttpResponseMessage
anIHttpActionResult
die vordefinierte Antwort von anpassenResponseMessage
. Es hat eine Weile gedauert, bis ich das herausgefunden habe, also wollte ich es veröffentlichen und zeigen, dass Sie sich nicht unbedingt für das eine oder andere entscheiden müssen:Hinweis: Dies
ResponseMessage
ist eine Methode der BasisklasseApiController
, von der Ihr Controller erben soll.quelle
ResponseMessage
undResponseMessageResult
sind zwei verschiedene Dinge.ResponseMessage()
ist eine Methode, vonApiController
der Ihr Controller erben sollte, und ist daher nur ein Methodenaufruf. Dort wird also keinnew
Schlüsselwort benötigt. Sie erben wahrscheinlich nicht vonApiController
oder befinden sich in einer statischen Methode.ResponseMessageResult
ist der Rückgabetyp vonResponseMessage()
.response = base.ResponseMessage(responseMsg)
, um klarer zu machen, dass es eine Methode der Basisklasse ApiController istSie können immer noch verwenden
HttpResponseMessage
. Diese Fähigkeit wird nicht verschwinden. Ich fühlte mich genauso wie Sie und argumentierte ausführlich mit dem Team, dass keine zusätzliche Abstraktion erforderlich sei. Es gab ein paar Argumente, um seine Existenz zu rechtfertigen, aber nichts, was mich davon überzeugt hätte, dass es sich gelohnt hat.Das heißt, bis ich dieses Beispiel von Brad Wilson gesehen habe . Wenn Sie
IHttpActionResult
Klassen auf eine Weise erstellen, die verkettet werden kann, können Sie eine Antwortpipeline auf Aktionsebene zum Generieren der erstellenHttpResponseMessage
. Unter dem Deckmantel wird dies soActionFilters
implementiert, aber die Reihenfolge dieserActionFilters
ist beim Lesen der Aktionsmethode nicht offensichtlich, was ein Grund ist, warum ich kein Fan von Aktionsfiltern bin.Indem Sie jedoch eine erstellen
IHttpActionResult
, die in Ihrer Aktionsmethode explizit verkettet werden kann, können Sie alle Arten von unterschiedlichen Verhaltensweisen erstellen , um Ihre Antwort zu generieren.quelle
Hier sind einige Vorteile von
IHttpActionResult
überHttpResponseMessage
in den genannten Microsoft ASP.Net Dokumentation :Aber hier sind einige andere Vorteile der Verwendung, die es
IHttpActionResult
wert sind, erwähnt zu werden:Ok
NotFound
Exception
Unauthorized
BadRequest
Conflict
Redirect
InvalidModelState
( Link zur vollständigen Liste )ExecuteAsync
Methode.ResponseMessageResult ResponseMessage(HttpResponseMessage response)
um HttpResponseMessage zu IHttpActionResult zu konvertieren .quelle
quelle
Dies ist nur meine persönliche Meinung und Leute vom Web-API-Team können es wahrscheinlich besser artikulieren, aber hier ist meine 2c.
Zunächst denke ich, dass es nicht um einander geht. Sie können sie beide je verwenden, was Sie in Ihrer Aktionsmethode tun wollen , sondern um die wirkliche Macht zu verstehen
IHttpActionResult
, dass Sie wahrscheinlich müssen Schritt außerhalb dieser bequemen HelfermethodenApiController
wieOk
,NotFound
usw.Grundsätzlich denke ich, dass eine Klasse
IHttpActionResult
als Fabrik von implementiertHttpResponseMessage
. Mit dieser Einstellung wird es nun zu einem Objekt, das zurückgegeben werden muss, und zu einer Fabrik, die es produziert. Im allgemeinen Programmiersinn können Sie das Objekt in bestimmten Fällen selbst erstellen, und in bestimmten Fällen benötigen Sie eine Factory, um dies zu tun. Hier gilt das gleiche.Wenn Sie eine Antwort zurückgeben möchten, die durch eine komplexe Logik erstellt werden muss, z. B. viele Antwortheader usw., können Sie all diese Logik in eine Aktionsergebnisklasse abstrahieren, die implementiert wird,
IHttpActionResult
und sie in mehreren Aktionsmethoden verwenden, um eine Antwort zurückzugeben.Ein weiterer Vorteil der Verwendung
IHttpActionResult
als Rückgabetyp besteht darin, dass die ASP.NET-Web-API-Aktionsmethode MVC ähnelt. Sie können jedes Aktionsergebnis zurückgeben, ohne sich in Medienformatierern zu verfangen.Wie von Darrel bemerkt, können Sie natürlich Aktionsergebnisse verketten und eine leistungsstarke Mikro-Pipeline erstellen, die den Nachrichtenhandlern selbst in der API-Pipeline ähnelt. Dies benötigen Sie abhängig von der Komplexität Ihrer Aktionsmethode.
Lange Rede kurzer Sinn - es ist nicht
IHttpActionResult
versusHttpResponseMessage
. Grundsätzlich möchten Sie die Antwort so erstellen. Mach es selbst oder durch eine Fabrik.quelle
ResponseFactory.CreateOkResponse()
diese erstellen kann , die HttpResponseMessage zurückgeben, und dass ich mich beim Erstellen der Antwort nicht mit dem asynchronen Zeug befassen musste. Ein Teammitglied erwähnte die Tatsache, dass die Asynchronisierung nützlich sein kann, wenn Sie E / A ausführen müssen, um Headerwerte zu generieren. Ich bin mir nicht sicher, wie oft das passiert.Der Web - API zurückgeben grundsätzlich 4 Objekttyp:
void
,HttpResponseMessage
,IHttpActionResult
, und andere starke Typen. Die erste Version der Web-API gibtHttpResponseMessage
eine ziemlich einfache HTTP-Antwortnachricht zurück.Das
IHttpActionResult
wurde von WebAPI 2 eingeführt, das eine Art Wrap von istHttpResponseMessage
. Es enthält dieExecuteAsync()
Methode zum Erstellen einesHttpResponseMessage
. Dies vereinfacht das Testen von Einheiten Ihres Controllers.Andere Rückgabetypen sind stark typisierte Klassen, die von der Web-API mithilfe eines Medienformatierers in den Antworttext serialisiert werden. Der Nachteil war, dass Sie einen Fehlercode wie einen 404 nicht direkt zurückgeben können. Sie können lediglich einen
HttpResponseException
Fehler auslösen.quelle
Ich möchte lieber die TaskExecuteAsync-Schnittstellenfunktion für IHttpActionResult implementieren. Etwas wie:
, wobei _request die HttpRequest und _respContent die Nutzlast ist.
quelle
Wir haben die folgenden Vorteile der Verwendung von
IHttpActionResult
overHttpResponseMessage
:IHttpActionResult
konzentrieren wir uns nur auf die zu sendenden Daten, nicht auf den Statuscode. Hier wird der Code also sauberer und sehr einfach zu pflegen sein.async
undawait
standardmäßig.quelle