Programování

Jak implementovat DelegatingHandler pro přepsání metody X-HTTP ve webovém rozhraní API

Při nasazování rozhraní REST Web API přes veřejnou doménu se někdy setkáte s problémy, které souvisejí s podporou sloves HTTP. Dvěma výzvami v tomto ohledu jsou omezená podpora pro slovesa HTTP ve starých webových prohlížečích (tj. Podporují pouze HTTP GET a HTTP POST) a agresivní brány firewall, které blokují provoz, který není ani HTTP GET, ani HTTP POST. Jak bude vaše aplikace v těchto případech podporovat PUT nebo DELETE? Tady je přesně místo, kde na pomoc přijde hlavička HTTP X-HTTP-Method-Override.

Záhlaví HTTP X-HTTP-Method-Override funguje poněkud podobně jako hack. Při vyvolání svého webového rozhraní API pomocí JavaScriptu nebo přes. Můžete přidat záhlaví s hodnotou PUT nebo DELETE XMLHttpRequest objekt z webového prohlížeče pomocí volání HTTP POST. Potom můžete nechat delegující obslužnou rutinu zachytit metodu HTTP, která má být vyvolána, a provést příslušné akce.

V tomto článku budu diskutovat o tom, jak můžeme použít delegující obslužnou rutinu před potrubím požadavku a odezvy ke změně požadavku na odeslání platné zprávy naší aplikaci, nebo ke změně odpovědi a k ​​odeslání zpět platné odpovědi klientovi.

Slovesa HTTP a delegující obslužné rutiny

Pokud jsme omezeni na používání pouze sloves HTTP GET a POST z důvodu omezení stanovených vaším klientem, webovým prohlížečem nebo bránou firewall, která stojí před vaší webovou aplikací, budeme muset implementovat řešení pro podporu PUT a DELETE. Toto řešení obvykle zahrnuje přidání hlavičky HTTP X-HTTP-Method-Override k požadavku, který určuje sloveso, které chceme použít v rámci volání HTTP POST. Kromě toho potřebujeme v naší aplikaci delegující obslužnou rutinu, která kontroluje záhlaví a pokud existuje, provede volání metody HTTP, kterou chcete vyvolat.

Než se ponoříme do implementace, pojďme se krátce podívat na to, co jsou delegující obsluhovači a proč bychom zde jednu použili. Obslužná rutina delegování a další obslužné rutiny zpráv se provádějí brzy v kanálu zpracování požadavků. Jedná se o třídy, které přijímají požadavky HTTP a vracejí odpověď HTTP. Delegující obslužní rutiny jsou podobné HttpModules v ASP.Net. Ale na rozdíl od HttpModules, delegující obslužné rutiny lze zřetězit: Jeden delegující obslužný program může odkazovat na jinou delegující obslužnou rutinu. Další informace o delegování obslužných rutin najdete v mém předchozím článku „Jak pracovat s obslužnými rutinami zpráv ve webovém rozhraní API.“

Vytvořte řadič webového rozhraní API

Předpokládejme, že máte řadič webového API podobný tomuto:

veřejná třída AuthorsController: ApiController

    {

// ZÍSKEJTE: api / autoři

public IEnumerable Get ()

        {

vrátit nový řetězec [] {„Joydip“, „Kanjilal“};

        }

// ZÍSKEJTE: api / autoři / 1

veřejný řetězec Get (int id)

        {

návrat „Joydip Kanjilal“;

        }

// POST api / autor

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

// PUT api / autor / 1

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

// ODSTRANIT api / autora / 1

public void Delete (int id) {}

    }

Vytvořte DelegatingHandler pro přepsání metody X-HTTP

Nyní pojďme implementovat obslužnou rutinu X-HTTP-Method-Override. Toto je obslužný program zpráv, takže jako obvykle by měl rozšířit DelegatingHandler třída.

veřejná třída CustomMessageHandler: DelegatingHandler

    {

readonly string [] httpMethodsList = {„DELETE“, „HEAD“, „PUT“};

const řetězec httpMethodOverrideheader;

chráněné přepsání úlohy SendAsync (požadavek HttpRequestMessage, CancellationToken zrušeníToken)

        {

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ávrat base.SendAsync (požadavek, zrušeníToken);

        }

    }

Tento kód je zcela vysvětlující. Zkontroluje HTTP POST, který má záhlaví X-HTTP-Method-Override. Pokud je záhlaví v seznamu metod, změní se metoda požadavku.

Zaregistrujte DelegatingHandler

Dalším krokem je registrace obslužné rutiny. Můžete to udělat přidáním této nové obslužné rutiny do kolekce MessageHandlers ve třídě WebApiConfig, jak je ukázáno v fragmentu kódu níže.

public static void Register (HttpConfiguration config)

{

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

// Trasy webového API

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

název: „DefaultApi“,

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

výchozí: nový {id = RouteParameter.Optional}

    );

}

Případně můžete delegující obsluhu zaregistrovat pomocí Application_Start obslužná rutina události v souboru Global.asax.cs, jak je uvedeno níže.

protected void Application_Start (odesílatel objektu, EventArgs e)

        {

RegisterRoutes (RouteTable.Routes);

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

        }

To je vše, co musíte udělat na straně serveru. Na straně klienta, tj. Z webového prohlížeče, byste se měli ujistit, že přidáte záhlaví přepsání, jak je znázorněno v úryvku kódu níže.

$ .ajax ({

url: „// localhost: 9820 / api / Autoři / 1“,

typ: „POST“,

data: JSON.stringify (authorData),

záhlaví: {

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

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

})

Jak vidíte v předchozím fragmentu kódu, vše, co musíte udělat, je zadat metodu HTTP, kterou chcete vyvolat, v záhlaví požadavku—Přepsání metody X-HTTP: DELETE nebo Přepsání metody X-HTTP: PUT- a poté zavolejte POST na váš zdroj.

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