Programavimas

Kaip dirbti su pranešimų tvarkytuvėmis žiniatinklio API

Žiniatinklio API pranešimų tvarkytuvai suteikia jums galimybę apdoroti, redaguoti ar atmesti gaunamą užklausą, kol ji pasiekia „HttpControllerDispatcher“. Pranešimų tvarkytojai vykdomi daug anksčiau užklausų apdorojimo procese, todėl jie yra puiki vieta įgyvendinti kompleksinius klausimus žiniatinklio API.

Įdiegus pasirinktinį pranešimų tvarkytuvą

Visi pranešimų tvarkytojai yra iš „HttpMessageHandler“ klasės. Norėdami sukurti savo pranešimų tvarkytuvą, turėtumėte išplėsti „DelegatingHandler“ klasę. Atkreipkite dėmesį, kad „DelegatingHandler“ klasė savo ruožtu yra kilusi iš „HttpMessageHandler“ klasės.

Apsvarstykite šį žiniatinklio API valdiklį.

viešoji klasė DefaultController: ApiController

    {

public HttpResponseMessage Get ()

        {

grąžinti Request.CreateResponse (HttpStatusCode.OK, "Numatytojo žiniatinklio API valdiklio viduje ...");

        }

    }

Norėdami sukurti pranešimų tvarkytuvą, turite išplėsti „DelegatingHandler“ klasę ir nepaisyti „SendAsync“ metodo.

viešoji klasė „Handler: DelegatingHandler“

    {

apsaugotas nepaisyti asinchroninio uždavinio „SendAsync“ („HttpRequestMessage“ užklausa, „CancellationToken“ cancellationToken)

        {

grąžinimo bazė.SendAsync (užklausa, cancellationToken);

        }

    }

Žiniatinklio API užklausų apdorojimo vamzdynas apima kelis įmontuotus pranešimų tvarkytuvus. Tai apima:

  • HttpServer - tai naudojama norint gauti užklausą iš pagrindinio kompiuterio
  • HttpRoutingDispatcher - tai naudojama užklausai išsiųsti pagal sukonfigūruotą maršrutą
  • „HttpControllerDispatcher“ - tai naudojama užklausai siųsti atitinkamam valdikliui

Galite įtraukti pranešimų tvarkytuvus į dujotiekį, kad atliktumėte vieną ar daugiau iš šių operacijų.

  • Atlikite autentifikavimą ir prieigą
  • Priimamų užklausų ir siunčiamų atsakymų registravimas
  • Pridėkite atsakymo antraštes prie atsakymo objektų
  • Perskaitykite arba pakeiskite užklausos antraštes

Šis kodo fragmentas parodo, kaip galite įdiegti paprastą pranešimų tvarkytuvą žiniatinklio API.

viešoji klasė „Handler: DelegatingHandler“

{

apsaugotas „asinchroninis“ nepaiso užduoties „SendAsync“ („HttpRequestMessage“ užklausa, „CancellationToken“ cancellationToken)

        {

var response = naujas HttpResponseMessage (HttpStatusCode.OK)

            {

„Content = new StringContent“ („Pranešimų tvarkytuvės viduje ...“)

            };

var task = naujas TaskCompletionSource ();

task.SetResult (atsakymas);

return laukti užduoties. Užduotis;

        }

}

Pranešimų tvarkytuvas neapdoroja užklausos pranešimo - sukuria atsakymo pranešimą ir tada jį grąžina. Taip pat galite paskambinti į pagrindinę „SendAsync“ metodo versiją, jei nenorite nieko daryti su gaunama užklausa, kaip parodyta žemiau esančiame kodų sąraše.

viešoji klasė „Handler: DelegatingHandler“

{

apsaugotas „asinchroninis“ nepaiso užduoties „SendAsync“ („HttpRequestMessage“ užklausa, „CancellationToken“ cancellationToken)

        {

grįžimas laukia bazės.SendAsync (request, cancellationToken);

        }

}

Taip pat galite parašyti kodą, norėdami užregistruoti Http užklausas ir atsakymus, išeinančius naudojant „SendAsync“ metodą.

Norėdami vykdyti žiniatinklio API, galite naudoti tokį bandymo metodą, koks pateiktas žemiau.

 [Bandymo metodas]

public void „WebAPIControllerTest“ ()

        {

„HttpClient“ klientas = naujas „HttpClient“ ();

var rezultatas = klientas.GetAsync (naujas URI ("// localhost // api / default /")). Rezultatas;

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

„Assert.IsTrue“ (rezultatas.IsSuccessStatusCode);

        }

Kai vykdote bandymo metodą, pranešimas „Numatytojo žiniatinklio API valdiklio viduje ...“ grąžinamas kaip atsakymo pranešimas ir bandymas praeina. Oi! Mes sukūrėme pranešimų tvarkytuvą, bet dar turime ją užregistruoti pranešimų tvarkymo vamzdyne.

Dabar turėtumėte pranešti žiniatinklio API infrastruktūrai, kur yra jūsų tinkintas tvarkytuvas. Norėdami tai padaryti, turėtumėte užregistruoti savo pasirinktinį tvarkytuvą. Galite užregistruoti ką tik sukurtą pasirinktinių pranešimų tvarkytuvą „WebApiConfig“ klasės registravimo metodu, kaip parodyta žemiau.

public static void Register („HttpConfiguration config“)

{

„GlobalConfiguration.Configuration.MessageHandlers.Add“ (naujas tvarkytuvas ());

}

Kai dar kartą atliksite bandymo metodą, teksto pranešimas „Žurnalo registravimo pranešimų tvarkytuvės viduje ...“ bus grąžintas kaip atsakymo pranešimas ir testas bus išlaikytas.

Atminkite, kad taip pat galite užregistruoti kelis pranešimų tvarkytuvus į pranešimų tvarkymo procesą, kaip parodyta toliau pateiktame kodo fragmente.

public static void Register („HttpConfiguration config“)

{

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

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

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

}

Pranešimų tvarkytojai būtų vykdomi tokia tvarka, kokia jie buvo pridėti prie dujotiekio, o atsakymas būtų grąžintas atvirkštine tvarka. Kitaip tariant, gaunant užklausą, pranešimų tvarkytojai vykdomi tokia tvarka, kokia jie yra užregistruoti. Išeinančio atsakymo metu procesas yra tiesiog atvirkštinis. Taigi, pranešimų tvarkytojai vykdomi atvirkštine jų registravimo į dujotiekį tvarka.

Taip pat galite įdiegti pranešimų tvarkytuvą, kuris tikrina gaunamą užklausą ir tikrina, ar užklausoje yra galiojantis api raktas. Jei api rakto nėra arba jis negalioja, jis pateikia atitinkamą klaidos pranešimą. Šis kodų sąrašas parodo, kaip galite tai padaryti - palieku jums parašyti kodą, kad vis tiek patvirtintumėte api raktą.

apsaugotas nepaisyti užduoties „SendAsync“ („HttpRequestMessage“ užklausa, „CancellationToken“ „cancellationToken“)

        {

eilutės raktas = HttpUtility.ParseQueryString (request.RequestUri.Query) .Get ("raktas");

string errorMessage = "Norint pasiekti žiniatinklio API, reikia nurodyti api raktą.";

bandyti

            {

jei (! string.IsNullOrWhiteSpace (raktas))

                {

grąžinimo bazė.SendAsync (užklausa, cancellationToken);

                }

Kitas

                {

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

mesti naują HttpResponseException (atsakas);

                }

            }

pagauti

            {

HttpResponseMessage response = request.CreateErrorResponse (HttpStatusCode.InternalServerError, "Įvyko netikėta klaida ...");

mesti naują HttpResponseException (atsakas);

            }

        }