Programiranje

Kako delati z upravljavci sporočil v spletnem API-ju

Obdelovalci sporočil v spletnem API-ju vam omogočajo obdelavo, urejanje ali zavrnitev dohodne zahteve, preden doseže HttpControllerDispatcher. Obdelovalci sporočil se izvajajo veliko prej v cevovodu za obdelavo zahtev, zato so odličen kraj za izvajanje medsektorskih težav v spletnem API-ju.

Implementacija obdelave sporočil po meri

Vsi obdelovalci sporočil izhajajo iz razreda HttpMessageHandler. Če želite zgraditi lasten obdelovalec sporočil, razširite razred DelegatingHandler. Upoštevajte, da razred DelegatingHandler izhaja iz razreda HttpMessageHandler.

Razmislite o naslednjem krmilniku spletnega API-ja.

javni razred DefaultController: ApiController

    {

public HttpResponseMessage Get ()

        {

vrni Request.CreateResponse (HttpStatusCode.OK, "Znotraj privzetega krmilnika spletnega API-ja ...");

        }

    }

Če želite ustvariti obdelovalec sporočil, morate razširiti razred DelegatingHandler in preglasiti metodo SendAsync.

vodnik javnega razreda: DelegatingHandler

    {

zaščitena razveljavitev asinh. opravila SendAsync (zahteva HttpRequestMessage, CancellationToken cancellationToken)

        {

return base.SendAsync (zahteva, odpovedToken);

        }

    }

Cevovod za obdelavo zahtev spletnega API-ja vključuje nekaj vgrajenih obdelovalcev sporočil. Sem spadajo naslednje:

  • HttpServer - uporablja se za pridobivanje zahteve od gostitelja
  • HttpRoutingDispatcher - uporablja se za pošiljanje zahteve na podlagi konfigurirane poti
  • HttpControllerDispatcher - uporablja se za pošiljanje zahteve ustreznemu krmilniku

V cevovod lahko dodate obdelovalce sporočil, da izvedejo eno ali več naslednjih operacij.

  • Izvedite preverjanje pristnosti in avtorizacijo
  • Beleženje dohodnih zahtev in odhodnih odgovorov
  • Dodajte odzivne glave v odzivne predmete
  • Preberite ali spremenite glave zahtev

Naslednji delček kode prikazuje, kako lahko v spletnem API-ju implementirate preprost upravljalnik sporočil.

vodnik javnega razreda: DelegatingHandler

{

zaščitena preglasitev asinh. opravila SendAsync (zahteva HttpRequestMessage, CancellationToken cancellationToken)

        {

odziv var = novo HttpResponseMessage (HttpStatusCode.OK)

            {

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

            };

var task = new TaskCompletionSource ();

task.SetResult (odgovor);

vrnitev čaka na opravilo. Naloga;

        }

}

Obdelovalec sporočil ne obdela sporočila zahteve - ustvari odzivno sporočilo in ga nato vrne. Pokličete lahko tudi osnovno različico metode SendAsync, če ne želite ničesar storiti z dohodno zahtevo, kot je prikazano v spodnjem seznamu kod.

vodnik javnega razreda: DelegatingHandler

{

zaščitena preglasitev asinh. opravila SendAsync (zahteva HttpRequestMessage, CancellationToken cancellationToken)

        {

vrnitev čaka base.SendAsync (zahteva, odpovedToken);

        }

}

Kodo lahko tudi napišete za beleženje zahtev Http in odgovorov, ki se pojavijo v metodi SendAsync.

Za zagon spletnega API-ja lahko uporabite preskusno metodo, kot je spodaj navedena.

 [TestMethod]

javna void WebAPIControllerTest ()

        {

Odjemalec HttpClient = nov HttpClient ();

var rezultat = client.GetAsync (nov Uri ("// localhost // api / default /")). Rezultat;

string responseMessage = result.Content.ReadAsStringAsync (). Rezultat;

Assert.IsTrue (result.IsSuccessStatusCode);

        }

Ko izvedete preskusno metodo, se sporočilo "Znotraj privzetega krmilnika spletnega API-ja ..." vrne kot odzivno sporočilo in preizkus opravi. Oh! Ustvarili smo upravljalnik sporočil, vendar ga še nismo registrirali v cevovodu za obdelavo sporočil.

Zdaj bi morali sporočiti infrastrukturi spletnega API-ja, kje obstaja vaš obdelovalec po meri. Če želite to narediti, morate v cevovodu registrirati svojega uporabnika po meri. Upravitelja sporočil po meri, ki smo ga pravkar ustvarili, lahko registrirate v metodi Register razreda WebApiConfig, kot je prikazano spodaj.

javni statični void Register (HttpConfiguration config)

{

GlobalConfiguration.Configuration.MessageHandlers.Add (new Handler ());

}

Ko znova zaženete preskusno metodo, se besedilno sporočilo "Znotraj vodnika sporočil dnevnika ..." vrne kot odzivno sporočilo in test mine.

Upoštevajte, da lahko v cevovod za obdelavo sporočil registrirate tudi več obdelovalcev sporočil, kot je prikazano v spodnjem delčku kode.

javni statični void Register (HttpConfiguration config)

{

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

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

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

}

Obdelovalci sporočil bi bili izvedeni v vrstnem redu, v katerem so bili dodani v cevovod, odgovor pa vrnjen v obratnem vrstnem redu. Z drugimi besedami, v času dohodne zahteve se upravljavci sporočil izvajajo v vrstnem redu, v katerem so registrirani. Med odhodnim odzivom se postopek ravno obrne. Torej se obdelovalci sporočil izvajajo v obratnem vrstnem redu od njihove registracije do cevovoda.

Uporabite lahko tudi upravljalnik sporočil, ki pregleda dohodno zahtevo in preveri, ali zahteva vsebuje veljaven ključ API. Če ključ api ni prisoten ali ni veljaven, vrne ustrezno sporočilo o napaki. Naslednji seznam kode prikazuje, kako to lahko storite - vseeno vam prepuščam, da napišete kodo za potrditev ključa api.

zaščiteno preglasitev opravila SendAsync (zahteva HttpRequestMessage, CancellationToken cancellationToken)

        {

string key = HttpUtility.ParseQueryString (request.RequestUri.Query) .Get ("key");

string errorMessage = "Za dostop do spletnega API-ja morate navesti ključ api.";

poskusite

            {

if (! string.IsNullOrWhiteSpace (ključ))

                {

return base.SendAsync (zahteva, odpovedToken);

                }

drugače

                {

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

vrzi novo HttpResponseException (odgovor);

                }

            }

ulov

            {

HttpResponseMessage response = request.CreateErrorResponse (HttpStatusCode.InternalServerError, "Prišlo je do nepričakovane napake ...");

vrzi novo HttpResponseException (odgovor);

            }

        }

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