Programmering

Sådan implementeres en DelegatingHandler til X-HTTP-metode-tilsidesættelse i Web API

Når du implementerer din REST Web API over et offentligt domæne, vil du undertiden støde på problemer, der er relateret til understøttelse af HTTP-verber. De to udfordringer i denne henseende er den begrænsede understøttelse af HTTP-verb i gamle webbrowsere (dvs. de understøtter kun HTTP GET og HTTP POST) og aggressive firewalls, der blokerer trafik, der ikke er en HTTP GET eller en HTTP POST. Hvordan understøtter din applikation en PUT eller SLET i disse tilfælde? Her er nøjagtigt, hvor X-HTTP-metode-tilsidesættelse HTTP-header kommer til undsætning.

X-HTTP-metode-tilsidesættelse HTTP-header fungerer noget som et hack. Du kan tilføje overskriften med en værdi på enten PUT eller SLET, når du påkalder din Web API via JavaScript eller via en XMLHttpRequest objekt fra en webbrowser ved hjælp af et HTTP POST-opkald. Du kan derefter få en delegerende handler til at opfange HTTP-metoden, der skal påberåbes, og tage de relevante handlinger.

I denne artikel vil jeg diskutere, hvordan vi kan bruge en delegerende handler foran anmodning-svar-pipelinen til at ændre anmodningen om at sende en gyldig besked til vores applikation eller ændre svaret for at sende et gyldigt svar tilbage til klienten.

HTTP-verb og delegerende håndtering

Hvis vi er begrænset til kun at bruge HTTP-verberne GET og POST på grund af begrænsninger, der er pålagt af din klient, webbrowseren eller firewallen, der ligger foran din webapplikation, bliver vi nødt til at implementere en løsning til at understøtte PUT og SLET. Denne løsning involverer typisk tilføjelse af X-HTTP-metode-tilsidesættelse HTTP-overskrift til anmodningen, der specificerer det verbum, vi vil bruge i HTTP POST-opkaldet. Derudover har vi brug for en delegerende handler i vores applikation, der kontrollerer for overskriften, og hvis den findes, foretager opkaldet til den HTTP-metode, du vil påberåbe sig.

Før vi dykker ned i implementeringen, skal vi se hurtigt på, hvad delegerende håndtere er, og hvorfor vi bruger en her. En delegerende handler og andre meddelelseshåndterere udføres tidligt i pipeline for anmodningsbehandling. Dette er klasser, der accepterer HTTP-anmodninger og returnerer et HTTP-svar. Delegeringshandlere svarer til HttpModules i ASP.Net. Men i modsætning til HttpModules, delegerende handlere kan lænkes: En delegerende handler kan henvise til en anden delegerende handler. Du kan lære mere om delegering af handlere fra min tidligere artikel, "Sådan arbejder du med meddelelseshåndterere i Web API."

Opret en Web API-controller

Antag, at du har en Web API-controller, der ligner denne:

offentlig klasse AuthorsController: ApiController

    {

// FÅ: api / forfattere

offentlig IEnumerable Get ()

        {

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

        }

// FÅ: api / forfattere / 1

public string 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) {}

// SLET api / forfatter / 1

offentlig tomrum Slet (int-id) {}

    }

Opret en DelegatingHandler til X-HTTP-metode-tilsidesættelse

Lad os nu implementere en X-HTTP-metode-tilsidesættelseshåndterer. Dette er en beskedhåndterer, så som normalt skal den udvide Delegering af håndterer klasse.

offentlig klasse CustomMessageHandler: DelegatingHandler

    {

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

const string httpMethodOverrideheader;

beskyttet tilsidesættelse Opgave SendAsync (HttpRequestMessage anmodning, CancellationToken cancellationToken)

        {

if (anmodning.Metode == HttpMethod.Post && anmodning.Headers.Contains (httpMethodOverrideheader))

            {               

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

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

                {                  

request.Method = ny HttpMethod (httpMethod);

                }

            }

return base.SendAsync (anmodning, cancellationToken);

        }

    }

Koden er ret selvforklarende. Det kontrollerer for en HTTP POST med X-HTTP-metode-tilsidesættelse header. Hvis overskriften er på listen over metoder, ændres anmodningsmetoden.

Registrer DelegatingHandler

Det næste trin er at registrere handleren. Du kan gøre dette ved at tilføje denne nye handler til MessageHandlers-samlingen i WebApiConfig-klassen som vist i kodestykket nedenfor.

offentligt statisk ugyldigt register (HttpConfiguration config)

{

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

// Web API-ruter

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

navn: “StandardApi”,

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

standardindstillinger: ny {id = RouteParameter.Optional}

    );

}

Alternativt kan du registrere den delegerende handler ved hjælp af Application_Start hændelseshåndterer i filen Global.asax.cs som vist nedenfor.

beskyttet ugyldighed Application_Start (objektafsender, EventArgs e)

        {

RegisterRoutes (rutetabel.ruter);

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

        }

Det er alt hvad du skal gøre på serversiden. På klientsiden, dvs. fra webbrowseren, skal du sørge for at tilføje tilsidesættelseshovedet som vist i kodestykket nedenfor.

$ .ajax ({

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

type: “POST”,

data: JSON.stringify (authorData),

overskrifter: {

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

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

})

Som du kan se i det forrige kodestykke, er alt, hvad du skal gøre, at angive den HTTP-metode, du vil påberåbe i anmodningsoverskriften—X-HTTP-metode-tilsidesættelse: SLET eller X-HTTP-metode-tilsidesættelse: PUT- og foretag derefter et POST-opkald til din ressource.

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