Programmering

Forstå parameterinnbinding i ASP.Net Web API

ASP.Net Web API er et lett rammeverk som kan brukes til å bygge RESTful HTTP-tjenester. Når du arbeider med kontrollermetoder i Web API, må du ofte sende parametere til disse metodene. En "parameter" refererer her ganske enkelt til argumentet til en metode, mens "parameterbinding" refererer til prosessen med å sette verdier til parametrene til Web API-metodene.

Merk at det er to måter Web API kan binde parametere på: modellbinding og formatering. Modellinnbinding brukes til å lese fra spørringsstrengen, mens formatere brukes til å lese fra forespørselen. Du kan også bruke omformere for å aktivere Web API for å behandle en klasse som en enkel type og deretter binde parameteren fra URI. For å gjøre dette må du opprette en tilpasset TypeConverter. Du kan også opprette en tilpasset modellperm ved å implementere IModelBinder-grensesnittet i klassen din og deretter implementere BindModel-metoden. Hvis du vil ha mer informasjon om typeomformere og modellbindere, kan du ta en titt på denne Microsoft-dokumentasjonen.

Nå, for å binde parametere, følger Web API denne regelen: For enkle typer prøver Web API å hente verdien fra URI, og for komplekse typer prøver Web API å hente verdien fra forespørselstypen. De enkle typene her refererer til både .Net primitive typer - int, bool, double, float og så videre - og til andre typer som inkluderer TimeSpan, DateTime, Guid, desimal og streng. Den inkluderer også alle typer som en typekonverterer er tilgjengelig som kan konverteres fra en streng. I neste avsnitt vil vi utforske attributtene [FromBody] og [FromUri] som brukes til å binde verdier fra henholdsvis forespørselens organ og URI.

Når skal du bruke [FromBody] og [FromUri] i Web API

Hvis du har brukt Web API en stund, kan du være kjent med attributtene [FromBody] og [FromUri]. [FromUri] -attributtet er foran parameteren for å spesifisere at verdien skal leses fra URI for forespørselen, og [FromBody] -attributtet brukes til å spesifisere at verdien skal leses fra forespørselens brødtekst.

For alle primitive typer (int, double, float, etc.) prøver Web API-kjøretiden å lese verdien fra URI for HTTP-forespørselen. For komplekse typer (forekomster av klasser) prøver Web API-kjøretiden å lese verdien fra kroppen til HTTP-forespørselen ved hjelp av en formatering av medietypen. Dette er standardoppførselen til Web API.

Derfor, hvis du har en verdi i forespørsels-URI som er en primitiv type, trenger du ikke å spesifisere [FromUri] -attributtet. På samme måte, hvis du har en verdi i forespørselens kropp som er en kompleks type, trenger du ikke å spesifisere [FromBody] -attributtet. Imidlertid, hvis den primitive typen ligger i forespørselens kropp eller den komplekse typen ligger i forespørselens URI, må du spesifisere [FromBody] eller [FromUri] -attributtet. Årsaken er at du avviker fra standardadferden i begge tilfeller.

Hvordan bruke [FromBody] og [FromUri] i Web API

Følgende kodebit illustrerer hvordan du kan spesifisere [FromBody] -attributtet for en grunnleggende datatype sendt som en parameter til en Web API-metode.

offentlig klasse SecurityController: ApiController

{

offentlig HttpResponseMessage Innlegg ([FromBody] int id)

    {

// Skriv koden din her

    }

}

Og her er et kodebit som illustrerer hvordan du kan overføre en kompleks type som parameter til en Web API-metode ved hjelp av FromUri-attributtet.

offentlig klasse SecurityController: ApiController

{

offentlig HttpResponseMessage-innlegg ([FromUri] brukerbruker)

    {

// Skriv koden din her

    }

}

Det skal bemerkes at det ikke er god praksis å sende brukerautentiseringsdata som brukernavn og passord gjennom URI, selv om du kanskje bruker SSL. Dette er fordi slike data kan lagres i nettleserloggene, der de er utsatt for eksponering. Når du overfører sensitive data (brukernavn, passord, kredittkortinformasjon, etc.) via forespørselsorganet, er det viktig å bruke [FromBody] i alle tilfeller.

Merk at når du bruker attributtet [FromBody] mens du overfører en parameter til en Web API-metode, utnytter Web API-kjøretiden innholdstypeoverskriften for å velge riktig formatering. Du kan lære mer om innholdsforhandlinger i Web API fra artikkelen min her.

$config[zx-auto] not found$config[zx-overlay] not found