Programmering

Hvordan jobbe med meldingshåndterere i Web API

Meldingshåndterere i Web API gir deg muligheten til å behandle, redigere eller avvise en innkommende forespørsel før den når HttpControllerDispatcher. Meldingshåndterere blir utført mye tidligere i forespørselsbehandlingsrørledningen, derfor er de et flott sted å implementere tverrgående bekymringer i Web API.

Implementering av en tilpasset meldingsbehandler

Alle meldingsbehandlere kommer fra klassen HttpMessageHandler. For å bygge din egen meldingsbehandler, bør du utvide klassen DelegatingHandler. Merk at DelegatingHandler-klassen i sin tur stammer fra HttpMessageHandler-klassen.

Vurder følgende Web API-kontroller.

offentlig klasse DefaultController: ApiController

    {

offentlig HttpResponseMessage Get ()

        {

returner Request.CreateResponse (HttpStatusCode.OK, "Inside the Standard Web API Controller ...");

        }

    }

For å opprette en meldingsbehandler, må du utvide klassen DelegatingHandler og overstyre SendAsync-metoden.

offentlig klasse Handler: DelegatingHandler

    {

beskyttet overstyring async Oppgave SendAsync (HttpRequestMessage forespørsel, CancellationToken cancellationToken)

        {

retur base.SendAsync (forespørsel, cancellationToken);

        }

    }

Web API-prosesseringsrørledningen inkluderer noen få innebygde meldingshåndterere. Disse inkluderer følgende:

  • HttpServer - dette brukes til å hente forespørselen fra verten
  • HttpRoutingDispatcher - dette brukes til å sende forespørselen basert på ruten som er konfigurert
  • HttpControllerDispatcher - dette brukes til å sende forespørselen til den respektive kontrolleren

Du kan legge til meldingshåndterere i rørledningen for å utføre en eller flere av følgende operasjoner.

  • Utfør godkjenning og autorisasjon
  • Logge innkommende forespørsler og utgående svar
  • Legg til svaroverskrifter i responsobjektene
  • Les eller endre forespørselsoverskriftene

Følgende kodebit viser hvordan du kan implementere en enkel meldingsbehandler i Web API.

offentlig klasse Handler: DelegatingHandler

{

beskyttet asynkoverstyring Oppgave SendAsync (HttpRequestMessage-forespørsel, CancellationToken cancellationToken)

        {

var respons = ny HttpResponseMessage (HttpStatusCode.OK)

            {

Content = new StringContent ("Inside the message handler ...")

            };

var oppgave = ny TaskCompletionSource ();

task.SetResult (respons);

retur venter oppgave. oppgave;

        }

}

Meldingsbehandleren behandler ikke forespørselsmeldingen - den oppretter svarmelding og returnerer den deretter. Du kan også ringe baseversjonen av SendAsync-metoden hvis du ikke vil gjøre noe med den innkommende forespørselen, som vist i kodelisten nedenfor.

offentlig klasse Handler: DelegatingHandler

{

beskyttet async overstyring Oppgave SendAsync (HttpRequestMessage forespørsel, CancellationToken cancellationToken)

        {

retur venter base.SendAsync (forespørsel, cancellationToken);

        }

}

Du kan også skrive kode for å logge Http-forespørslene og svarene som går ut i SendAsync-metoden.

For å utføre Web API kan du bruke en testmetode som den som er gitt nedenfor.

 [Testmetode]

offentlig ugyldig WebAPIControllerTest ()

        {

HttpClient-klient = ny HttpClient ();

var resultat = client.GetAsync (ny Uri ("// localhost // api / standard /")). Resultat;

streng responseMessage = result.Content.ReadAsStringAsync (). Resultat;

Assert.IsTrue (result.IsSuccessStatusCode);

        }

Når du utfører testmetoden, blir meldingen "Inside the Standard Web API Controller ..." returnert som en svarmelding og testen går. Åh! Vi opprettet en meldingsbehandler, men vi skal ennå ikke registrere den i meldingshåndteringsrørledningen.

Du må nå informere web-API-infrastrukturen om hvor din tilpassede behandler eksisterer. For å gjøre dette, bør du registrere din egendefinerte behandler i rørledningen. Du kan registrere den tilpassede meldingsbehandleren vi nettopp opprettet i Register-metoden til WebApiConfig-klassen som vist nedenfor.

public static void Register (HttpConfiguration config)

{

GlobalConfiguration.Configuration.MessageHandlers.Add (ny håndterer ());

}

Når du utfører testmetoden igjen, returneres tekstmeldingen "Inside the logging message handler ..." som en svarmelding og testen går.

Merk at du også kan registrere flere meldingsbehandlere til meldingshåndteringsrørledningen som vist i kodebiten nedenfor.

public static void Register (HttpConfiguration config)

{

GlobalConfiguration.Configuration.MessageHandlers.Add (ny MessageHandlerA ());

GlobalConfiguration.Configuration.MessageHandlers.Add (ny MessageHandlerB ());

GlobalConfiguration.Configuration.MessageHandlers.Add (ny MessageHandlerC ());

}

Meldingshåndtererne vil bli utført i den rekkefølgen de er lagt til rørledningen, og svaret vil bli returnert i omvendt rekkefølge. Med andre ord, på tidspunktet for innkommende forespørsel, blir meldingshåndtererne utført i den rekkefølgen de er registrert. Under den utgående responsen er prosessen bare snudd. Så meldingshåndtererne blir utført i omvendt rekkefølge av registreringen til rørledningen.

Du kan også implementere en meldingsbehandler som inspiserer den innkommende forespørselen og sjekker om forespørselen inneholder en gyldig API-nøkkel. Hvis api-nøkkelen ikke er tilstede eller ikke er gyldig, returnerer den en passende feilmelding. Følgende kodeliste viser hvordan du kan gjøre dette - jeg overlater det til deg å skrive koden for å validere api-nøkkelen uansett.

beskyttet overstyring Oppgave SendAsync (HttpRequestMessage forespørsel, CancellationToken cancellationToken)

        {

strengnøkkel = HttpUtility.ParseQueryString (forespørsel.RequestUri.Query) .Get ("nøkkel");

string errorMessage = "Du må spesifisere api-nøkkelen for å få tilgang til Web API.";

prøve

            {

hvis (! string.IsNullOrWhiteSpace (nøkkel))

                {

retur base.SendAsync (forespørsel, cancellationToken);

                }

ellers

                {

HttpResponseMessage response = request.CreateErrorResponse (HttpStatusCode.Forbidden, errorMessage);

kaste nye HttpResponseException (respons);

                }

            }

å fange

            {

HttpResponseMessage response = request.CreateErrorResponse (HttpStatusCode.InternalServerError, "En uventet feil oppstod ...");

kaste nye HttpResponseException (respons);

            }

        }