Ohjelmointi

DelegatingHandler for X-HTTP-Method-Override -työkalun käyttöönotto Web-sovellusliittymässä

Kun otat REST Web -sovellusliittymän julkisen verkon yli, saatat joskus kohdata ongelmia, jotka liittyvät HTTP-verbien tukeen. Kaksi haastetta tässä suhteessa ovat rajoitettu tuki HTTP-verbeille vanhoissa selaimissa (ts. Ne tukevat vain HTTP GET ja HTTP POST) ja aggressiiviset palomuurit, jotka estävät liikenteen, joka ei ole HTTP GET tai HTTP POST. Kuinka sovelluksesi tukee PUT- tai DELETE-toimintoa näissä tapauksissa? Tässä tarkalleen missä X-HTTP-Method-Override HTTP -otsikko tulee apuun.

X-HTTP-Method-Override HTTP -otsikko toimii hieman samanlaisena kuin hakkerointi. Voit lisätä otsikon arvolla joko PUT tai DELETE, kun haet Web-sovellusliittymää JavaScriptin tai XMLHttpRequest objekti web-selaimelta HTTP POST -puhelun avulla. Sitten voit antaa valtuuttavan käsittelijän siepata käynnistettävän HTTP-menetelmän ja suorittaa tarvittavat toimet.

Tässä artikkelissa keskustelen siitä, miten voimme käyttää delegointikäsittelijää pyyntö-vastaus-putken edessä muuttaa pyyntöä lähettää kelvollinen viesti sovelluksellemme tai muuttaa vastausta lähettääksesi kelvollisen vastauksen asiakkaalle.

HTTP-verbit ja käsittelijöiden delegointi

Jos asiakkaamme, verkkoselaimesi tai verkkosovelluksesi edessä olevan palomuurin asettamien rajoitusten vuoksi meidän on käytettävä vain HTTP-verbejä GET ja POST, meidän on toteutettava kiertotapa PUT- ja DELETE-toimintojen tukemiseksi. Tämä kiertotapa sisältää tyypillisesti X-HTTP-Method-Override HTTP -otsikon lisäämisen pyyntöön, joka määrittää verbin, jota haluamme käyttää HTTP POST -kutsussa. Lisäksi tarvitsemme sovelluksemme valtuuttavan käsittelijän, joka tarkistaa otsikon ja jos se on olemassa, kutsuu HTTP-menetelmän, jonka haluat kutsua.

Ennen kuin sukeltaa käyttöönottoon, katsotaanpa nopeasti, mitä delegoivat käsittelijät ovat ja miksi käytämme sitä täällä. Delegoiva käsittelijä ja muut viestinkäsittelijät suoritetaan pyyntöjen käsittelyn varhaisessa vaiheessa. Nämä ovat luokkia, jotka hyväksyvät HTTP-pyynnöt ja palauttavat HTTP-vastauksen. Käsittelijöiden delegointi on samanlainen kuin Http-moduulit ASP.Net-tiedostossa. Mutta toisin Http-moduulit, delegoivat käsittelijät voidaan ketjuttaa: Yksi delegoiva käsittelijä voi viitata toiseen delegoivaan käsittelijään. Voit lukea lisää käsittelijöiden siirtämisestä edellisestä artikkelista "Kuinka käsitellä viestinkäsittelijöitä Web-sovellusliittymässä".

Luo Web-API-ohjain

Oletetaan, että sinulla on samanlainen Web API -ohjain:

public class AuthorsController: ApiController

    {

// GET: api / tekijät

public IEnumerable Get ()

        {

palauta uusi merkkijono [] {“Joydip”, “Kanjilal”};

        }

// GET: api / tekijät / 1

julkinen merkkijono Get (int id)

        {

palauta ”Joydip Kanjilal”;

        }

// POST api / tekijä

public void Viesti ([FromBody] Kirjoittaja-arvo) {}

// PUT api / author / 1

public void Put (int id, [FromBody] Tekijäarvo) {}

// POISTA api / author / 1

public void Poista (int id) {}

    }

Luo DelegatingHandler X-HTTP-Method-Override -ohjelmaa varten

Otetaan nyt käyttöön X-HTTP-Method-Override -käsittelijä. Tämä on viestinkäsittelijä, joten tavalliseen tapaan sen tulisi laajentaa Käsittelijän delegointi luokassa.

julkisen luokan CustomMessageHandler: DelegatingHandler

    {

readonly string [] httpMethodsList = {"POISTA", "PÄÄ", "PUT"};

const-merkkijono httpMethodOverrideheader;

suojattu ohitus Tehtävä SendAsync (HttpRequestMessage request, CancellationToken cancellationToken)

        {

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

            {               

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

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

                {                  

request.Method = uusi HttpMethod (httpMethod);

                }

            }

return base.SendAsync (pyyntö, peruutusToken);

        }

    }

Koodi on melko itsestään selvä. Se tarkistaa, onko HTTP POST -palvelussa X-HTTP-Method-Override -otsikko. Jos otsikko on menetelmien luettelossa, pyyntötapa muuttuu.

Rekisteröi DelegatingHandler

Seuraava vaihe on rekisteröidä käsittelijä. Voit tehdä tämän lisäämällä uuden käsittelijän WebApiConfig-luokan MessageHandlers-kokoelmaan alla olevan koodinpätkän mukaisesti.

public static void Register (HttpConfiguration config)

{

config.MessageHandlers.Add (uusi CustomMessageHandler ());

// Web-sovellusliittymän reitit

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

nimi: “DefaultApi”,

routeTemplate: "api / {ohjain} / {id}",

oletusarvot: uusi {id = RouteParameter.Optional}

    );

}

Vaihtoehtoisesti voit rekisteröidä delegoivan käsittelijän käyttämällä Application_Start tapahtumankäsittelijä Global.asax.cs-tiedostossa alla olevan kuvan mukaisesti.

suojattu void Application_Start (objektin lähettäjä, EventArgs e)

        {

RegisterRoutes (RouteTable.Routes);

GlobalConfiguration.Configuration.MessageHandlers.Add (uusi CustomMessageHandler ());

        }

Se on kaikki mitä sinun on tehtävä palvelimen puolella. Asiakkaan puolella, ts. Verkkoselaimesta, varmista, että lisäät ohitusotsikon alla olevan koodinpätkän mukaisesti.

$ .ajax ({

url: “// paikallinen isäntä: 9820 / api / Tekijät / 1”,

tyyppi: “POST”,

data: JSON.stringify (authorData),

otsikot: {

"Sisältötyyppi": "sovellus / json",

"X-HTTP-Method-Override": "PUT"},

})

Kuten edellisestä koodinpätkästä näet, sinun tarvitsee vain määrittää HTTP-menetelmä, jonka haluat käynnistää pyynnön otsikossa -X-HTTP-Method-Override: POISTA tai X-HTTP-Method-Override: PUT- ja soita sitten POST-puhelu resurssillesi.