Begrijp parameterbinding in ASP.Net Web API

ASP.Net Web API is een lichtgewicht framework dat kan worden gebruikt voor het bouwen van RESTful HTTP-services. Wanneer u met controllermethoden in Web API werkt, moet u vaak parameters aan die methoden doorgeven. Een "parameter" verwijst hier eenvoudig naar het argument van een methode, terwijl "parameterbinding" verwijst naar het proces van het instellen van waarden voor de parameters van de Web API-methoden.

Merk op dat er twee manieren zijn waarop Web API parameters kan binden: modelbinding en formatters. Modelbinding wordt gebruikt om uit de queryreeks te lezen, terwijl formatters worden gebruikt om uit de hoofdtekst van het verzoek te lezen. U kunt ook typeconversieprogramma's gebruiken om Web API in te schakelen om een ​​klasse als een eenvoudig type te behandelen en vervolgens de parameter van de URI te binden. Om dit te doen, moet u een aangepaste TypeConverter maken. U kunt ook een aangepaste modelbinder maken door de IModelBinder-interface in uw klas te implementeren en vervolgens de BindModel-methode te implementeren. Raadpleeg deze Microsoft-documentatie voor meer informatie over typeconverters en modelbinders.

Om parameters te binden, volgt Web API deze regel: voor eenvoudige typen probeert de web-API de waarde uit de URI te halen, en voor complexe typen probeert de web-API de waarde uit de hoofdtekst van het verzoek te halen. De eenvoudige typen verwijzen hier naar zowel de .Net primitieve typen - int, bool, double, float, enzovoort - als naar andere typen, waaronder TimeSpan, DateTime, Guid, decimal en string. Het bevat ook elk type waarvoor een type-omzetter beschikbaar is die kan converteren van een string. In de volgende sectie zullen we de [FromBody] en [FromUri] attributen onderzoeken die gebruikt worden om waarden van respectievelijk de request body en URI te binden.

Wanneer [FromBody] en [FromUri] gebruiken in Web API

Als je de Web API al een tijdje gebruikt, ben je wellicht bekend met de [FromBody] en [FromUri] attributen. Het [FromUri] -attribuut wordt voorafgegaan door de parameter om aan te geven dat de waarde moet worden gelezen uit de URI van het verzoek, en het [FromBody] -attribuut wordt gebruikt om aan te geven dat de waarde moet worden gelezen uit de body van het verzoek.

Voor alle primitieve typen (int, double, float, enz.), Probeert de Web API-runtime de waarde uit de URI van het HTTP-verzoek te lezen. Voor complexe typen (instanties van klassen) probeert de Web API-runtime de waarde uit de body van het HTTP-verzoek te lezen met behulp van een media-type formatter. Dit is het standaardgedrag van Web API. 

Als u dus een waarde in de aanvraag-URI heeft die een primitief type is, hoeft u het [FromUri] -attribuut niet op te geven. Evenzo, als u een waarde in de hoofdtekst van het verzoek heeft die een complex type is, hoeft u het [FromBody] -attribuut niet op te geven. Als het primitieve type zich echter in de hoofdtekst van het verzoek bevindt of het complexe type zich in de verzoek-URI bevindt, moet u het [FromBody] - of het [FromUri] -attribuut specificeren. De reden is dat u in beide gevallen afwijkt van het standaardgedrag.

Hoe [FromBody] en [FromUri] te gebruiken in Web API

Het volgende codefragment illustreert hoe u het [FromBody] -kenmerk kunt specificeren voor een fundamenteel gegevenstype dat als parameter wordt doorgegeven aan een Web API-methode.

openbare klasse SecurityController: ApiController

{

    openbare HttpResponseMessage-post ([FromBody] int id)

    {

       // Schrijf hier uw code

    }

}

En hier is een codefragment dat illustreert hoe u een complex type als parameter kunt doorgeven aan een Web API-methode met behulp van het FromUri-kenmerk.

openbare klasse SecurityController: ApiController

{

    openbare HttpResponseMessage Post ([FromUri] User user)

    {

       // Schrijf hier uw code

    }

}

Opgemerkt moet worden dat het verzenden van gebruikersauthenticatiegegevens zoals gebruikersnaam en wachtwoord via de URI geen goede gewoonte is, zelfs als u SSL gebruikt. Dit komt omdat dergelijke gegevens kunnen worden opgeslagen in browserlogboeken, waar ze kwetsbaar zijn voor blootstelling. Bij het doorgeven van gevoelige gegevens (gebruikersnamen, wachtwoorden, creditcardgegevens, enz.) Via de verzoekende instantie, is het absoluut noodzakelijk om in elk geval [FromBody] te gebruiken.

Merk op dat wanneer u het [FromBody] -attribuut gebruikt terwijl u een parameter doorgeeft aan een Web API-methode, de Web API-runtime profiteert van de header van het inhoudstype om de juiste formatter te selecteren. U kunt hier meer lezen over inhoudsonderhandelingen in Web API in mijn artikel.