Programmēšana

Kā ieviest DelegatingHandler for X-HTTP-Method-Override Web API

Izvietojot REST Web API, izmantojot publisku domēnu, dažreiz rodas problēmas, kas saistītas ar HTTP darbības vārdu atbalstu. Divas problēmas šajā ziņā ir ierobežots HTTP darbības vārdu atbalsts vecajās tīmekļa pārlūkprogrammās (t.i., tie atbalsta tikai HTTP GET un HTTP POST) un agresīvi ugunsmūri, kas bloķē trafiku, kas nav ne HTTP GET, ne HTTP POST. Kā jūsu lietojumprogramma šajos gadījumos atbalstīs PUT vai DELETE? Lūk, tieši šeit palīdz X-HTTP-Method-Override HTTP galvene.

X-HTTP-Method-Override HTTP galvene darbojas nedaudz līdzīgi uzlaušanai. Varat pievienot galveni ar vērtību PUT vai DELETE, izsaucot Web API, izmantojot JavaScript vai izmantojot XMLHttpRequest objekts no tīmekļa pārlūkprogrammas, izmantojot HTTP POST zvanu. Pēc tam jūs varat likt deleģējošajam apdarinātājam pārtvert HTTP metodi, kas jāizsauc, un veikt atbilstošās darbības.

Šajā rakstā es apspriedīšu, kā mēs varam izmantot deleģēšanas apstrādātāju pieprasījuma-atbildes cauruļvada priekšā, lai mainītu pieprasījumu nosūtīt derīgu ziņojumu uz mūsu lietojumprogrammu vai mainītu atbildi, lai klientam nosūtītu atpakaļ derīgu atbildi.

HTTP darbības vārdi un apstrādātāju deleģēšana

Ja mūsu klienta, tīmekļa pārlūkprogrammas vai jūsu tīmekļa lietojumprogrammas priekšā esošā ugunsmūra ierobežojumu dēļ mēs izmantojam tikai HTTP darbības vārdus GET un POST, mums būs jāievieš risinājums, lai atbalstītu PUT un DELETE. Šis risinājums parasti ietver X-HTTP-Method-Override HTTP galvenes pievienošanu pieprasījumam, kurā norādīts darbības vārds, kuru mēs vēlamies izmantot HTTP POST zvanā. Turklāt mūsu lietojumprogrammā ir nepieciešams deleģējošs apdarinātājs, kas pārbauda galveni un, ja tāda pastāv, veic zvanu uz HTTP metodi, kuru vēlaties izsaukt.

Pirms iedziļināties ieviešanā, ātri apskatīsim, kas ir deleģējošie apstrādātāji un kāpēc mēs to šeit izmantotu. Deleģējošais apstrādātājs un citi ziņojumu apstrādātāji tiek izpildīti pieprasījumu apstrādes procesa sākumā. Tās ir klases, kas pieņem HTTP pieprasījumus un atgriež HTTP atbildi. Handleru deleģēšana ir līdzīga HttpModules ASP.Net. Bet atšķirībā HttpModules, deleģējošos apdarinātājus var saķēdēt: viens deleģējošais apdarinātājs var atsaukties uz citu deleģējošo apdarinātāju. Vairāk par apstrādātāju deleģēšanu varat uzzināt no mana iepriekšējā raksta “Kā strādāt ar ziņojumu apstrādātājiem Web API”.

Izveidojiet Web API kontrolieri

Pieņemsim, ka jums ir Web API kontrolieris, kas ir līdzīgs šim:

publiskā klase AuthorsController: ApiController

    {

// IEGŪT: api / autori

public IEnumerable Get ()

        {

atgriezt jaunu virkni [] {“Joydip”, “Kanjilal”};

        }

// IEGŪT: api / autori / 1

publiskā virkne Get (int id)

        {

atgriešanās “Joydip Kanjilal”;

        }

// POST api / autors

public void Post ([FromBody] Autora vērtība) {}

// PUT api / autors / 1

public void Put (int id, [FromBody] Autora vērtība) {}

// Dzēst api / autors / 1

public void Dzēst (int id) {}

    }

Izveidojiet DelegatingHandler X-HTTP-Method-Override

Tagad ieviesīsim X-HTTP-Method-Override apdarinātāju. Šis ir ziņojumu apstrādātājs, tāpēc, kā parasti, tam jāpaplašina DeleģējotHandler klasē.

publiskā klase CustomMessageHandler: DelegatingHandler

    {

tikai lasāma virkne [] httpMethodsList = {“Dzēst”, “GALVA”, “IELIKT”};

const virkne httpMethodOverrideheader;

aizsargāts ignorēt uzdevumu SendAsync (HttpRequestMessage pieprasījums, CancellationToken cancellationToken)

        {

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

            {               

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

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

                {                  

pieprasījums.Metode = new HttpMethod (httpMethod);

                }

            }

atgriešanās bāze.SendAsync (pieprasījums, atcelšanaToken);

        }

    }

Kods ir diezgan pašsaprotams. Tas pārbauda, ​​vai nav HTTP POST ar galveni X-HTTP-Method-Override. Ja galvene ir metožu sarakstā, pieprasījuma metode tiek mainīta.

Reģistrējiet DelegatingHandler

Nākamais solis ir apstrādātāja reģistrēšana. To var izdarīt, pievienojot šo jauno apdarinātāju WebApiConfig klases MessageHandlers kolekcijai, kā parādīts zemāk esošajā koda fragmentā.

public static void Register (HttpConfiguration config)

{

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

// Tīmekļa API maršruti

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

nosaukums: “DefaultApi”,

routeTemplate: “api / {kontrolieris} / {id}",

noklusējumi: new {id = RouteParameter.Optional}

    );

}

Varat arī reģistrēt deleģējošo apdarinātāju, izmantojot Application_Start notikumu apstrādātājs failā Global.asax.cs, kā parādīts zemāk.

aizsargāta spēkā neesoša Application_Start (objekta sūtītājs, EventArgs e)

        {

RegisterRoutes (RouteTable.Routes);

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

        }

Tas ir viss, kas jums jādara servera pusē. Klienta pusē, t.i., no tīmekļa pārlūkprogrammas, pārliecinieties, vai esat pievienojis ignorēšanas galveni, kā parādīts zemāk esošajā koda fragmentā.

$ .ajax ({

URL: “// localhost: 9820 / api / Autori / 1”,

tips: “POST”,

dati: JSON.stringify (authorData),

galvenes: {

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

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

})

Kā redzat iepriekšējā koda fragmentā, viss, kas jums jādara, pieprasījuma galvenē jānorāda HTTP metode, kuru vēlaties izsaukt -X-HTTP-Method-Override: DELETE vai X-HTTP-Method-Override: PUT- un pēc tam veiciet POST zvanu savam resursam.

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