Programovanie

Ako implementovať DelegatingHandler pre prepísanie metódy X-HTTP vo webovom rozhraní API

Pri nasadení vášho webového rozhrania REST Web API na verejnú doménu sa niekedy stretnete s problémami, ktoré súvisia s podporou slovies HTTP. Dvomi výzvami v tejto súvislosti sú obmedzená podpora pre slovesá HTTP v starých webových prehliadačoch (t. J. Podporujú iba HTTP GET a HTTP POST) a agresívne brány firewall, ktoré blokujú prenos, ktorý nie je ani HTTP GET, ani HTTP POST. Ako bude vaša aplikácia v týchto prípadoch podporovať PUT alebo DELETE? Presne tu prichádza na pomoc hlavička HTTP X-HTTP-Method-Override HTTP.

Hlavička HTTP X-HTTP-Method-Override funguje do istej miery ako hack. Hlavičku s hodnotou PUT alebo DELETE môžete pridať pri vyvolaní vášho webového API pomocou JavaScriptu alebo pomocou XMLHttpRequest objekt z webového prehliadača pomocou volania HTTP POST. Potom môžete nechať delegujúcu obslužnú rutinu zachytiť metódu HTTP, ktorá sa má vyvolať, a vykonať príslušné akcie.

V tomto článku budem diskutovať o tom, ako môžeme použiť delegujúci obslužný program pred plynovodom požiadaviek a odpovedí na zmenu žiadosti o odoslanie platnej správy do našej aplikácie alebo zmeny odpovede na odoslanie platnej odpovede klientovi späť.

Slovesá HTTP a obslužné rutiny delegovania

Ak sme nútení používať iba slovesá HTTP GET a POST z dôvodu obmedzení stanovených vašim klientom, webovým prehliadačom alebo bránou firewall, ktorá sa nachádza vo vašej webovej aplikácii, budeme musieť implementovať riešenie podporujúce PUT a DELETE. Toto riešenie zvyčajne zahŕňa pridanie hlavičky HTTP X-HTTP-Method-Override k požiadavke, ktorá určuje sloveso, ktoré chceme použiť v rámci hovoru HTTP POST. Okrem toho v našej aplikácii potrebujeme delegujúci obslužný program, ktorý kontroluje hlavičku a ak existuje, zavolá metódu HTTP, ktorú chcete vyvolať.

Predtým, ako sa ponoríme do implementácie, poďme sa v krátkosti pozrieť na to, čo sú delegujúce manipulátory a prečo by sme ich tu používali. Obslužná rutina delegovania a ďalšie obslužné rutiny správ sa vykonajú na začiatku procesu spracovania požiadaviek. Jedná sa o triedy, ktoré prijímajú požiadavky HTTP a vracajú odpoveď HTTP. Delegujúci manipulátori sú podobní ako HttpModules v ASP.Net. Ale na rozdiel od HttpModules, delegujúce obslužné rutiny môžu byť pripútané: Jeden delegujúci obslužný program môže odkazovať na iného delegujúceho obslužného programu. Viac informácií o delegovaní obslužných rutín sa dozviete z môjho predchádzajúceho článku „Ako pracovať so spracovateľmi správ vo webovom rozhraní API.“

Vytvorte radič webového rozhrania API

Predpokladajme, že máte podobný radič webového API:

verejná trieda AuthorsController: ApiController

    {

// ZÍSKAJTE: api / autori

verejné IEnumerable Get ()

        {

vrátiť nový reťazec [] {“Joydip”, “Kanjilal”};

        }

// ZÍSKAJTE: api / autori / 1

verejný reťazec Get (int id)

        {

návrat „Joydip Kanjilal“;

        }

// POST api / autor

public void Post ([FromBody] hodnota autora) {}

// PUT api / autor / 1

public void Put (int id, [FromBody] hodnota autora) {}

// ODSTRÁNIŤ api / autora / 1

public void Delete (int id) {}

    }

Vytvorte DelegatingHandler pre prepísanie metódy X-HTTP

Teraz implementujme obslužný program X-HTTP-Method-Override. Toto je obsluha správ, takže ako obvykle by sa mala rozširovať DelegatingHandler trieda.

verejná trieda CustomMessageHandler: DelegatingHandler

    {

reťazec iba na čítanie [] httpMethodsList = {„DELETE“, „HEAD“, „PUT“};

reťazec const httpMethodOverrideheader;

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

        {

if (request.Method == HttpMethod.Post && request.Headers.Contains (httpMethodOverrideheader))

            {               

var httpMethod = request.Headers.GetValues ​​(httpMethodOverrideheader) .FirstOrDefault ();

if (httpMethodsList.Contains (httpMethod, StringComparer.InvariantCultureIgnoreCase))

                {                  

request.Method = nový HttpMethod (httpMethod);

                }

            }

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

        }

    }

Tento kód je úplne zrejmý. Kontroluje HTTP POST, ktorý má hlavičku X-HTTP-Method-Override. Ak je hlavička v zozname metód, spôsob požiadavky sa zmení.

Zaregistrujte DelegatingHandler

Ďalším krokom je registrácia obsluhy. Môžete to urobiť pridaním tohto nového obslužného programu do kolekcie MessageHandlers v triede WebApiConfig, ako je uvedené v útržku kódu nižšie.

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

{

config.MessageHandlers.Add (nový CustomMessageHandler ());

// trasy webového API

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

názov: „DefaultApi“,

routeTemplate: “api / {controller} / {id}”,

predvolené hodnoty: new {id = RouteParameter.Optional}

    );

}

Prípadne môžete delegovať obsluhu zaregistrovať pomocou Application_Start obslužná rutina udalosti v súbore Global.asax.cs, ako je uvedené nižšie.

protected void Application_Start (odosielateľ objektu, EventArgs e)

        {

RegisterRoutes (RouteTable.Routes);

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

        }

To je všetko, čo musíte urobiť na strane servera. Na strane klienta, t. J. Z webového prehliadača, by ste sa mali ubezpečiť, že ste pridali hlavičku prepísania, ako je uvedené v útržku kódu nižšie.

$ .ajax ({

url: „// localhost: 9820 / api / Authors / 1“,

typ: „POST“,

údaje: JSON.stringify (authorData),

hlavičky: {

„Content-Type“: „application / json“,

“X-HTTP-Method-Override”: “PUT”},

})

Ako vidíte v predchádzajúcom úryvku kódu, všetko, čo musíte urobiť, je zadať metódu HTTP, ktorú chcete vyvolať, v hlavičke požiadavky—Prepísanie metódy X-HTTP: DELETE alebo Prepísanie metódy X-HTTP: PUT- a potom uskutočnite POST volanie na váš zdroj.

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