Programmering

Hvordan implementere en DelegatingHandler for X-HTTP-Method-Override i Web API

Når du distribuerer REST Web API over et offentlig domene, vil du noen ganger støte på problemer som er relatert til støtte for HTTP-verb. De to utfordringene i denne forbindelse er den begrensede støtten for HTTP-verb i gamle nettlesere (dvs. de støtter bare HTTP GET og HTTP POST) og aggressive brannmurer som blokkerer trafikk som ikke er en HTTP GET eller en HTTP POST. Hvordan vil søknaden din støtte en PUT eller SLETTE i disse tilfellene? Her er nøyaktig hvor X-HTTP-Method-Override HTTP header kommer til unnsetning.

HTTP-overskriften til X-HTTP-Method-Override fungerer noe som en hacking. Du kan legge til overskriften med verdien PUT eller SLETT når du påkaller Web API via JavaScript eller via en XMLHttpRequest objekt fra en nettleser ved hjelp av en HTTP POST-samtale. Deretter kan du få en delegerende håndterer til å avskjære HTTP-metoden som skal påberopes, og ta de nødvendige handlingene.

I denne artikkelen vil jeg diskutere hvordan vi kan bruke en delegeringsbehandler foran forespørselsresponsrørledningen for å endre forespørselen om å sende en gyldig melding til applikasjonen vår, eller endre svaret for å sende tilbake et gyldig svar til klienten.

HTTP-verb og delegering av håndtere

Hvis vi er begrenset til å bare bruke HTTP-verbene GET og POST på grunn av begrensninger som er pålagt av klienten din, nettleseren eller brannmuren foran webapplikasjonen din, må vi implementere en løsning for å støtte PUT og SLETT. Denne løsningen innebærer vanligvis å legge til HTTP-overskriften X-HTTP-Method-Override i forespørselen som spesifiserer verbet vi vil bruke i HTTP POST-samtalen. I tillegg trenger vi en delegeringsbehandler i applikasjonen vår som sjekker for overskriften og, hvis den eksisterer, ringer til HTTP-metoden du vil påberope.

Før vi dykker ned i implementeringen, skal vi ta en rask titt på hva delegerende håndtere er og hvorfor vi vil bruke en her. En delegerende behandler og andre meldingsbehandlere blir utført tidlig i forespørselsrørledningen. Dette er klasser som godtar HTTP-forespørsler og returnerer et HTTP-svar. Delegering av håndtere ligner på HttpModules i ASP.Net. Men i motsetning til HttpModules, delegerende håndtere kan lenkes: En delegeringshandler kan referere til en annen delegeringshandler. Du kan lære mer om delegering av behandlere fra min forrige artikkel, "Hvordan jobbe med meldingshåndterere i Web API."

Opprett en Web API-kontroller

Anta at du har en Web API-kontroller som ligner på denne:

offentlig klasse AuthorsController: ApiController

    {

// FÅ: api / forfattere

offentlig IEnumerable Get ()

        {

returner ny streng [] {“Joydip”, “Kanjilal”};

        }

// FÅ: api / forfattere / 1

offentlig streng Get (int id)

        {

returner “Joydip Kanjilal”;

        }

// POST api / forfatter

public void Post ([FromBody] Author value) {}

// PUT api / author / 1

public void Put (int id, [FromBody] Author value) {}

// SLETT api / forfatter / 1

public void Delete (int id) {}

    }

Lag en DelegatingHandler for X-HTTP-Method-Override

La oss nå implementere en X-HTTP-Method-Override-behandler. Dette er en meldingsbehandler, så som vanlig skal den utvide Delegering av håndterer klasse.

offentlig klasse CustomMessageHandler: DelegatingHandler

    {

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

const string httpMethodOverrideheader;

beskyttet overstyring Oppgave SendAsync (HttpRequestMessage forespørsel, CancellationToken cancellationToken)

        {

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

            {               

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

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

                {                  

request.Method = ny HttpMethod (httpMethod);

                }

            }

retur base.SendAsync (forespørsel, cancellationToken);

        }

    }

Koden er ganske selvforklarende. Den ser etter en HTTP POST som har X-HTTP-Method-Override header. Hvis overskriften er i listen over metoder, endres forespørselsmetoden.

Registrer DelegatingHandler

Neste trinn er å registrere behandleren. Du kan gjøre dette ved å legge til denne nye behandleren i MessageHandlers-samlingen i WebApiConfig-klassen som vist i kodebiten nedenfor.

public static void Register (HttpConfiguration config)

{

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

// Web API-ruter

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

navn: “DefaultApi”,

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

standardinnstillinger: ny {id = RouteParameter.Optional}

    );

}

Alternativt kan du registrere delegeringshandleren ved hjelp av Application_Start hendelsesbehandler i filen Global.asax.cs som vist nedenfor.

beskyttet ugyldighet Application_Start (objektavsender, EventArgs e)

        {

RegisterRoutes (rutetabell.rutene);

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

        }

Det er alt du trenger å gjøre på serversiden. På klientsiden, dvs. fra nettleseren, bør du sørge for at du legger til overstyringshodet som vist i kodebiten nedenfor.

$ .ajax ({

url: “// localhost: 9820 / api / Forfattere / 1”,

type: “POST”,

data: JSON.stringify (authorData),

overskrifter: {

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

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

})

Som du kan se i forrige kodebit, er alt du trenger å gjøre å spesifisere HTTP-metoden du vil påberope i forespørselstittelen -X-HTTP-metode-overstyring: SLETT eller X-HTTP-metode-overstyring: PUT- og ring deretter en POST-samtale til ressursen din.

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