ASP.Net Web API er et lett rammeverk som brukes til å bygge statsløse og RESTful HTTP-tjenester. RESTful-tjenester er lette, statsløse, klientserverbaserte, cacheable tjenester som er basert på ressursbegrepet. REST er en arkitektonisk stil - et sett med begrensninger som brukes til å implementere statsløse tjenester. Det er et arkitektonisk paradigme som brukes til å skape gjenbrukbare, skalerbare tjenester.
Representasjon av en ressurs i det formatet du etterspør er et interessant tema, siden du ofte vil konsumere tjenestene dine fra forskjellige typer enheter. Innholdsforhandling er et av de viktigste konseptene i Web API. Selv om det er et relativt enkelt konsept, er det mange misforståelser og misforståelser rundt dette emnet. Når du designer og implementerer RESTful-tjenester ved hjelp av Web API, trenger du ofte å håndtere innholdsforhandlinger.
Hva er forhandlet innhold og hvorfor er det viktig?
Innholdsforhandlinger kan defineres som prosessen med å inspisere strukturen til en innkommende HTTP-forespørsel for å bestemme den beste representasjonen av en ressurs blant flere tilgjengelige representasjoner av samme ressurs. I hovedsak er innholdsforhandlinger et konsept som gjør at den samme nettadressen kan tjene det samme innholdet i forskjellige formater. Du kan dra nytte av innholdsforhandlinger for å velge ønsket medietype.
I Web API utføres innholdsforhandlinger av kjøretiden (på serversiden) for å bestemme medietypeformateringen som skal brukes basert på å returnere svaret for en innkommende forespørsel fra klientsiden.
Innholdsforhandlinger er sentrert om mediatype og mediatypeformatering. Mens førstnevnte refererer til verdien av "innholdstype" -hode i HTTP-forespørsel og HTTP-respons, brukes sistnevnte til å konvertere .NET-typer til tilsvarende HTTP-data og omvendt. Merk at mediatypeformatering i Web API er representert av en abstrakt klasse kalt MediaTypeFormatter.
Web API-rammeverket leveres med følgende formatere som standard.
- System.Net.Http.Formatting.JsonMediaTypeFormatter
- System.Net.Http.Formatting.XmlMediaTypeFormatter
- System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
- System.Web.Http.ModelBinding.JQueryMvcFormUrlEncodedFormatter
For å tilpasse innholdsforhandlinger i Web API, er det viktigste utvidelsespunktet du trenger å dra nytte av, mediatypekartlegging. Merk at Web API kommer med følgende mediatypetilordninger som standard.
- QueryStringMapping
- UriPathExtensionMapping
- RequestHeaderMapping
- MediaRangeMapping
For å bygge deg tilpasset mediatypekartlegging, må du opprette en klasse som utvider MediaTypeMapping som vist i kodebiten nedenfor.
offentlig klasse MediaTypeMapping: MediaTypeMapping
{
beskyttet overstyring dobbel OnTryMatchMediaType (HttpResponseMessage respons)
{
// Skriv din tilpassede kode her
}
}
Følgende kodebit illustrerer hvordan du kan hente navnene på alle støttede formatere i Web API ved å gjenta HttpConfiguration.Formatters-samlingen.
[HttpGet]
offentlig liste GetAllFormatters ()
{
Liste lstFormaters = ny liste ();
foreach (var formatter in this.Configuration.Formatters)
{
lstFormaters.Add (formatter.GetType (). Navn);
}
returnere første formater;
}
La oss nå undersøke hvordan vi kan arbeide med innholdsforhandlinger for å velge formateringen vi ønsker og hente innholdet i det formatet vi trenger. Tenk på følgende enhetsklasse.
offentlig klasse CustomerDTO
{
offentlig Int32 Id
{ få; sett; }
offentlig streng Fornavn
{ få; sett; }
offentlig streng Etternavn
{ få; sett; }
offentlig streng Adresse
{ få; sett; }
}
Anta deretter at du har en metode som fyller ut data i en liste av typen CustomerDTO og returnerer den.
privat liste GetCustomerData ()
{
Liste lstCustomers = ny liste ();
CustomerDTO-kunde = ny CustomerDTO ();
kunde.Id = 1;
customer.FirstName = "Joydip";
customer.LastName = "Kanjilal";
customer.Address = "Hyderabad, India";
lstCustomers.Add (kunde);
retur lstKunder;
}
Den følgende Web API-metoden viser hvordan du kan returnere HttpResponseMessage som et svar fra Web API-metoden din, basert på standard tilgjengelig forhandlingsmekanisme.
[HttpGet]
offentlige HttpResponseMessage GetCustomers ()
{
Liste lstCustomers = GetCustomerData ();
IContentNegotiator forhandler = Configuration.Services.GetContentNegotiator ();
ContentNegotiationResult result = negotiator.Negotiate (typeof (CustomerDTO), Request, Configuration.Formatters);
returner nye HttpResponseMessage ()
{
Innhold = nytt ObjectContent
};
}
Hvis du skulle bruke en bestemt formater som er tilgjengelig i formatersamlingen, kan det være lurt å omskrive den samme metoden som vist i kodebiten nedenfor.
[HttpGet]
offentlige HttpResponseMessage GetCustomers ()
{
Liste lstCustomers = GetCustomerData ();
returner nye HttpResponseMessage ()
{
Innhold = nytt ObjectContent
};
}
Ok; men hvordan bygger du din egen tilpassede formater da? Vel, for å lage en tilpasset mediatypeformatering, bør du opprette en klasse som utvider MediaTypeFormatter-abstraktklassen. Deretter bør du skrive den egendefinerte koden i klassen du opprettet for å overstyre metodene til abstraktklassen MediaTypeFormatter.
offentlig klasse CustomMediaTypeFormatter: MediaTypeFormatter
{
offentlig overstyring bool CanReadType (Type type)
{
kaste nye NotImplementedException ();
}
offentlig overstyring bool CanWriteType (Type type)
{
kaste nye NotImplementedException ();
}
}
Når den tilpassede formateringen er på plass, kan du enkelt legge den til formatersamlingen:
config.Formatters.Add (ny CustomMediaTypeFormatter ());