Grundlegendes zur Parameterbindung in der ASP.Net-Web-API

Die ASP.Net-Web-API ist ein kompaktes Framework, das zum Erstellen von RESTful-HTTP-Diensten verwendet werden kann. Wenn Sie mit Controller-Methoden in der Web-API arbeiten, müssen Sie häufig Parameter an diese Methoden übergeben. Ein "Parameter" bezieht sich hier einfach auf das Argument einer Methode, während sich "Parameterbindung" auf den Prozess des Festlegens von Werten für die Parameter der Web-API-Methoden bezieht.

Beachten Sie, dass die Web-API auf zwei Arten Parameter binden kann: Modellbindung und Formatierer. Die Modellbindung wird zum Lesen aus der Abfragezeichenfolge verwendet, während Formatierer zum Lesen aus dem Anforderungshauptteil verwendet werden. Sie können auch Typkonverter verwenden, um der Web-API zu ermöglichen, eine Klasse als einfachen Typ zu behandeln und dann den Parameter aus dem URI zu binden. Dazu müssten Sie einen benutzerdefinierten TypeConverter erstellen. Sie können auch einen benutzerdefinierten Modellordner erstellen, indem Sie die IModelBinder-Schnittstelle in Ihrer Klasse implementieren und anschließend die BindModel-Methode implementieren. Weitere Informationen zu Typkonvertern und Modellbindern finden Sie in dieser Microsoft-Dokumentation.

Um Parameter zu binden, folgt die Web-API nun dieser Regel: Bei einfachen Typen versucht die Web-API, den Wert vom URI abzurufen, und bei komplexen Typen versucht die Web-API, den Wert vom Anforderungshauptteil abzurufen. Die einfachen Typen hier beziehen sich sowohl auf die primitiven .Net-Typen - int, bool, double, float usw. - als auch auf andere Typen, die TimeSpan, DateTime, Guid, decimal und string enthalten. Es enthält auch alle Typen, für die ein Typkonverter verfügbar ist, der aus einer Zeichenfolge konvertieren kann. Im nächsten Abschnitt werden die Attribute [FromBody] und [FromUri] untersucht, die zum Binden von Werten aus dem Anforderungshauptteil bzw. dem URI verwendet werden.

Wann werden [FromBody] und [FromUri] in der Web-API verwendet?

Wenn Sie die Web-API seit einiger Zeit verwenden, sind Sie möglicherweise mit den Attributen [FromBody] und [FromUri] vertraut. Das Attribut [FromUri] wird dem Parameter vorangestellt, um anzugeben, dass der Wert aus dem URI der Anforderung gelesen werden soll, und das Attribut [FromBody] wird verwendet, um anzugeben, dass der Wert aus dem Hauptteil der Anforderung gelesen werden soll.

Für alle primitiven Typen (int, double, float usw.) versucht die Web-API-Laufzeit, den Wert aus dem URI der HTTP-Anforderung zu lesen. Bei komplexen Typen (Instanzen von Klassen) versucht die Web-API-Laufzeit, den Wert mithilfe eines Medientyp-Formatierers aus dem Hauptteil der HTTP-Anforderung zu lesen. Dies ist das Standardverhalten der Web-API. 

Wenn Sie also einen Wert im Anforderungs-URI haben, der ein primitiver Typ ist, müssen Sie das Attribut [FromUri] nicht angeben. Wenn Sie im Anforderungshauptteil einen Wert haben, der ein komplexer Typ ist, müssen Sie das Attribut [FromBody] nicht angeben. Wenn sich der primitive Typ jedoch im Anforderungshauptteil oder der komplexe Typ im Anforderungs-URI befindet, müssen Sie das Attribut [FromBody] oder [FromUri] angeben. Der Grund ist, dass Sie in beiden Fällen vom Standardverhalten abweichen.

Verwendung von [FromBody] und [FromUri] in der Web-API

Das folgende Codeausschnitt zeigt, wie Sie das Attribut [FromBody] für einen grundlegenden Datentyp angeben können, der als Parameter an eine Web-API-Methode übergeben wird.

öffentliche Klasse SecurityController: ApiController

{

    public HttpResponseMessage Post ([FromBody] int id)

    {

       // Schreibe deinen Code hier

    }}

}}

Und hier ist ein Code-Snippet, das zeigt, wie Sie einen komplexen Typ als Parameter mithilfe des FromUri-Attributs an eine Web-API-Methode übergeben können.

öffentliche Klasse SecurityController: ApiController

{

    public HttpResponseMessage Post ([FromUri] Benutzer Benutzer)

    {

       // Schreibe deinen Code hier

    }}

}}

Es ist zu beachten, dass das Senden von Benutzerauthentifizierungsdaten wie Benutzername und Kennwort über den URI keine gute Vorgehensweise ist, selbst wenn Sie möglicherweise SSL verwenden. Dies liegt daran, dass solche Daten möglicherweise in Browserprotokollen gespeichert werden, wo sie anfällig für Gefährdung sind. Wenn Sie vertrauliche Daten (Benutzernamen, Kennwörter, Kreditkarteninformationen usw.) über den Anfragetext weitergeben, müssen Sie in jedem Fall unbedingt [FromBody] verwenden.

Beachten Sie, dass bei Verwendung des Attributs [FromBody] beim Übergeben eines Parameters an eine Web-API-Methode die Web-API-Laufzeit den Inhaltstyp-Header verwendet, um den richtigen Formatierer auszuwählen. Weitere Informationen zur Inhaltsverhandlung in der Web-API finden Sie in meinem Artikel hier.