Programmering

Forstå parameterbinding i ASP.Net Web API

ASP.Net Web API er en let ramme, der kan bruges til at opbygge RESTful HTTP-tjenester. Når du arbejder med controller-metoder i Web API, skal du ofte videresende parametre til disse metoder. En "parameter" refererer her ganske enkelt til argumentet til en metode, mens "parameterbinding" henviser til processen med at indstille værdier til parametrene for Web API-metoderne.

Bemærk, at der er to måder, hvorpå Web API kan binde parametre: modelbinding og formatere. Modelbinding bruges til at læse fra forespørgselsstrengen, mens formatere bruges til at læse fra anmodningens brødtekst. Du kan også bruge typekonvertere til at aktivere Web API til at behandle en klasse som en simpel type og derefter binde parameteren fra URI. For at gøre dette skal du oprette en brugerdefineret TypeConverter. Du kan også oprette en brugerdefineret modelbinder ved at implementere IModelBinder-grænsefladen i din klasse og derefter implementere BindModel-metoden. For mere om typekonvertere og modelbindere, se på denne Microsoft-dokumentation.

For at binde parametre følger Web API nu denne regel: For enkle typer forsøger Web API at hente værdien fra URI, og for komplekse typer forsøger Web API at hente værdien fra anmodningsorganet. De enkle typer her henviser til både. Net-primitive typer - int, bool, dobbelt, float osv. - og til andre typer, der inkluderer TimeSpan, DateTime, Guid, decimal og streng. Det inkluderer også enhver type, som en typekonverter er tilgængelig for, der kan konvertere fra en streng. I det næste afsnit undersøger vi attributterne [FromBody] og [FromUri], der bruges til at binde værdier fra henholdsvis anmodningens organ og URI.

Hvornår skal man bruge [FromBody] og [FromUri] i Web API

Hvis du har brugt Web API i nogen tid, er du muligvis bekendt med attributterne [FromBody] og [FromUri]. Attributten [FromUri] er forud for parameteren for at angive, at værdien skal læses fra anmodningen URI, og attributten [FromBody] bruges til at specificere, at værdien skal læses fra anmodningen.

For alle primitive typer (int, dobbelt, float osv.) Forsøger Web API-runtime at læse værdien fra URI for HTTP-anmodningen. For komplekse typer (forekomster af klasser) forsøger Web API-runtime at læse værdien fra kroppen af ​​HTTP-anmodningen ved hjælp af en mediatype-formatering. Dette er standardadfærden for Web API.

Derfor, hvis du har en værdi i anmodnings-URI'en, der er en primitiv type, behøver du ikke angive attributten [FromUri]. Tilsvarende, hvis du har en værdi i anmodningens krop, der er en kompleks type, behøver du ikke angive attributten [FromBody]. Men hvis den primitive type findes i anmodningens krop eller den komplekse type findes i anmodningens URI, skal du angive attributten [FromBody] eller [FromUri]. Årsagen er, at du afviger fra standardadfærden i begge tilfælde.

Sådan bruges [FromBody] og [FromUri] i Web API

Følgende kodestykke illustrerer, hvordan du kan specificere [FromBody] -attributten for en grundlæggende datatype, der sendes som parameter til en Web API-metode.

offentlig klasse SecurityController: ApiController

{

offentlig HttpResponseMessage Post ([FromBody] int id)

    {

// Skriv din kode her

    }

}

Og her er et kodestykke, der illustrerer, hvordan du kan overføre en kompleks type som parameter til en Web API-metode ved hjælp af FromUri-attributten.

offentlig klasse SecurityController: ApiController

{

offentlig HttpResponseMessage-indlæg ([FromUri] brugerbruger)

    {

// Skriv din kode her

    }

}

Det skal bemærkes, at afsendelse af brugergodkendelsesdata som brugernavn og adgangskode gennem URI ikke er en god praksis, selvom du muligvis bruger SSL. Dette skyldes, at sådanne data muligvis gemmes i browserlogfiler, hvor de er sårbare over for eksponering. Når du overfører følsomme data (brugernavne, adgangskoder, kreditkortoplysninger osv.) Via anmodningsorganet, er det bydende nødvendigt at bruge [FromBody] i alle tilfælde.

Bemærk, at når du bruger attributten [FromBody], mens du sender en parameter til en Web API-metode, udnytter Web API-kørselstidens indholdstypehoved til at vælge den rigtige formatering. Du kan lære mere om indholdsforhandling i Web API fra min artikel her.