Programovanie

Ako pracovať so spracovateľmi správ vo webovom rozhraní API

Obslužné nástroje správ vo webovom rozhraní API vám poskytujú príležitosť spracovať, upraviť alebo odmietnuť prichádzajúcu požiadavku skôr, ako sa dostane na HttpControllerDispatcher. Obslužné programy správ sa vykonávajú oveľa skôr v potrubí spracovania požiadaviek, a preto sú skvelým miestom na implementáciu prierezových problémov vo webovom rozhraní API.

Implementácia vlastného spracovania správ

Všetky obslužné rutiny správ sú odvodené z triedy HttpMessageHandler. Ak chcete vytvoriť svoj vlastný obslužný program správ, mali by ste rozšíriť triedu DelegatingHandler. Všimnite si, že trieda DelegatingHandler je zase odvodená od triedy HttpMessageHandler.

Zvážte nasledujúci radič webového API.

verejná trieda DefaultController: ApiController

    {

verejná HttpResponseMessage Get ()

        {

return Request.CreateResponse (HttpStatusCode.OK, "Inside the Default Web API Controller ...");

        }

    }

Ak chcete vytvoriť obslužný program správy, musíte rozšíriť triedu DelegatingHandler a prepísať metódu SendAsync.

obsluha verejnej triedy: DelegatingHandler

    {

chránené prepísanie asynchrónnej úlohy SendAsync (požiadavka HttpRequestMessage, CancellationToken CancelToken)

        {

návratová základňa.SendAsync (požiadavka, stornoToken);

        }

    }

Kanál spracovania požiadaviek webového API obsahuje niekoľko vstavaných obslužných nástrojov správ. Medzi ne patria:

  • HttpServer - slúži na získanie požiadavky od hostiteľa
  • HttpRoutingDispatcher - slúži na odoslanie žiadosti na základe nakonfigurovanej trasy
  • HttpControllerDispatcher - slúži na odoslanie žiadosti príslušnému kontrolórovi

Môžete pridať obslužné rutiny správ do kanálu, aby ste mohli vykonať jednu alebo viac z nasledujúcich operácií.

  • Vykonajte autentifikáciu a autorizáciu
  • Protokolovanie prichádzajúcich požiadaviek a odchádzajúcich odpovedí
  • Pridajte do hlavičiek odpovedí hlavičky odpovedí
  • Prečítajte si alebo upravte hlavičky požiadaviek

Nasledujúci úryvok kódu ukazuje, ako môžete implementovať jednoduchý obslužný program správ vo webovom rozhraní API.

obsluha verejnej triedy: DelegatingHandler

{

chránené prepísanie async Úloha SendAsync (požiadavka HttpRequestMessage, CancellationToken cancellationToken)

        {

var response = new HttpResponseMessage (HttpStatusCode.OK)

            {

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

            };

var task = new TaskCompletionSource ();

task.SetResult (odpoveď);

návrat čaká úloha.Task;

        }

}

Obslužný program správy nespracuje správu s požiadavkou - vytvorí správu s odpoveďou a potom ju vráti. Môžete tiež zavolať základnú verziu metódy SendAsync, ak by ste s prichádzajúcou požiadavkou nechceli nič robiť, ako je uvedené v zozname kódov nižšie.

obsluha verejnej triedy: DelegatingHandler

{

chránené prepísanie async Úloha SendAsync (požiadavka HttpRequestMessage, CancellationToken cancellationToken)

        {

návrat čaká base.SendAsync (request, CancelToken);

        }

}

Môžete tiež napísať kód na protokolovanie požiadaviek HTTP a odpovedí, ktoré vychádzajú v metóde SendAsync.

Na spustenie webového rozhrania API môžete použiť testovaciu metódu, ako je uvedená nižšie.

 [Testovacia metóda]

public void WebAPIControllerTest ()

        {

HttpClient klient = nový HttpClient ();

var result = client.GetAsync (new Uri ("// localhost // api / default /")). Výsledok;

string responseMessage = result.Content.ReadAsStringAsync (). Výsledok;

Assert.IsTrue (result.IsSuccessStatusCode);

        }

Po vykonaní testovacej metódy sa vráti správa „Inside the Default Web API Controller ...“ ako správa s odpoveďou a test prejde. Och! Vytvorili sme obslužnú rutinu správ, ale ešte ju nezaregistrujeme do potrubia na spracovanie správ.

Teraz by ste museli dať infraštruktúre webového API vedieť, kde existuje váš vlastný obslužný program. Ak to chcete urobiť, mali by ste zaregistrovať svoj vlastný obslužný program v potrubí. Môžete zaregistrovať vlastný obslužný program správ, ktorý sme práve vytvorili v metóde Register triedy WebApiConfig, ako je uvedené nižšie.

verejný statický neplatný register (konfigurácia HttpConfiguration)

{

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

}

Po opätovnom vykonaní testovacej metódy sa textová správa „Inside the loging message handler ...“ vráti ako správa s odpoveďou a test prejde.

Upozorňujeme, že do potrubia na spracovanie správ môžete zaregistrovať aj viac spracovateľov správ, ako je uvedené v útržku kódu nižšie.

verejný statický neplatný register (konfigurácia HttpConfiguration)

{

GlobalConfiguration.Configuration.MessageHandlers.Add (nový MessageHandlerA ());

GlobalConfiguration.Configuration.MessageHandlers.Add (nový MessageHandlerB ());

GlobalConfiguration.Configuration.MessageHandlers.Add (nový MessageHandlerC ());

}

Obsluhy správ by sa vykonávali v poradí, v akom boli pridané do potrubia, a odpoveď by sa vrátila v opačnom poradí. Inými slovami, v čase prichádzajúcej žiadosti sa obslužné rutiny správ vykonávajú v poradí, v akom sú zaregistrované. Počas odchádzajúcej odpovede je proces iba obrátený. Obsluhy správ sa teda vykonávajú v opačnom poradí, v akom sa zaregistrujú do potrubia.

Môžete tiež implementovať obslužný program správ, ktorý kontroluje prichádzajúcu požiadavku a kontroluje, či požiadavka obsahuje platný kľúč API. Ak kľúč api nie je prítomný alebo nie je platný, vráti príslušné chybové hlásenie. Nasledujúci zoznam kódov ukazuje, ako to môžete urobiť - ponechám na vás, aby ste napísali kód na overenie kľúča api aj tak.

chránené prepísanie úlohy SendAsync (požiadavka HttpRequestMessage, CancellationToken cancellationToken)

        {

string key = HttpUtility.ParseQueryString (request.RequestUri.Query) .Get ("kľúč");

string errorMessage = "Musíte zadať kľúč api pre prístup k webovému API.";

skús

            {

if (! string.IsNullOrWhiteSpace (kľúč))

                {

návratová základňa.SendAsync (požiadavka, stornoToken);

                }

inak

                {

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

hodiť novú HttpResponseException (odpoveď);

                }

            }

chytiť

            {

HttpResponseMessage response = request.CreateErrorResponse (HttpStatusCode.InternalServerError, "Vyskytla sa neočakávaná chyba ...");

hodiť novú HttpResponseException (odpoveď);

            }

        }

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