Programmēšana

Kā strādāt ar ziņojumu apstrādātājiem Web API

Tīmekļa API ziņojumu apstrādātāji sniedz jums iespēju apstrādāt, rediģēt vai noraidīt ienākošo pieprasījumu, pirms tas sasniedz HttpControllerDispatcher. Ziņojumu apstrādātāji tiek izpildīti daudz agrāk pieprasījumu apstrādes cauruļvadā, tāpēc tie ir lieliska vieta, lai Web API ieviestu transversālas problēmas.

Pielāgotu ziņojumu apstrādātāja ieviešana

Visi ziņojumu apstrādātāji ir no klases HttpMessageHandler. Lai izveidotu pats savu ziņojumu apstrādātāju, jums jāpaplašina klase DelegatingHandler. Ņemiet vērā, ka klase DelegatingHandler savukārt nāk no klases HttpMessageHandler.

Apsveriet šo Web API kontrolieri.

publiskā klase DefaultController: ApiController

    {

public HttpResponseMessage Get ()

        {

atgriezt Request.CreateResponse (HttpStatusCode.OK, "Inside the Default Web API Controller ...");

        }

    }

Lai izveidotu ziņojumu apstrādātāju, jums jāpaplašina klase DelegatingHandler un jāignorē metode SendAsync.

sabiedrības klases apdarinātājs: Haldera deleģēšana

    {

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

        {

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

        }

    }

Web API pieprasījumu apstrādes cauruļvads ietver dažus iebūvētus ziņojumu apstrādātājus. Tie ietver sekojošo:

  • HttpServer - to izmanto, lai izgūtu pieprasījumu no resursdatora
  • HttpRoutingDispatcher - tas tiek izmantots, lai nosūtītu pieprasījumu, pamatojoties uz konfigurēto maršrutu
  • HttpControllerDispatcher - tas tiek izmantots, lai nosūtītu pieprasījumu attiecīgajam kontrolierim

Varat pievienot ziņojumu apstrādātājus cauruļvadam, lai veiktu vienu vai vairākas no šīm darbībām.

  • Veiciet autentifikāciju un autorizāciju
  • Ienākošo pieprasījumu un izejošo atbilžu reģistrēšana
  • Pievienojiet atbildes galvenes atbildes objektiem
  • Izlasiet vai modificējiet pieprasījuma galvenes

Šis koda fragments parāda, kā Web API var ieviest vienkāršu ziņojumu apstrādātāju.

sabiedrības klases apdarinātājs: Haldera delegēšana

{

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

        {

var response = jauns HttpResponseMessage (HttpStatusCode.OK)

            {

Content = new StringContent ("Ziņojumu apstrādātāja iekšpusē ...")

            };

var task = jauns TaskCompletionSource ();

task.SetResult (atbilde);

atgriezties gaidīt uzdevumu. Uzdevums;

        }

}

Ziņojumu apstrādātājs neapstrādā pieprasījuma ziņojumu - tas izveido atbildes ziņojumu un pēc tam to atdod. Varat arī piezvanīt uz SendAsync metodes bāzes versiju, ja nevēlaties neko darīt ar ienākošo pieprasījumu, kā parādīts zemāk esošajā kodu sarakstā.

sabiedrības klases apdarinātājs: Haldera delegēšana

{

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

        {

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

        }

}

Varat arī ierakstīt kodu, lai reģistrētu Http pieprasījumus un atbildes, kas iziet SendAsync metodē.

Lai izpildītu Web API, varat izmantot testa metodi, piemēram, zemāk norādīto.

 [Pārbaudes metode]

public void WebAPIControllerTest ()

        {

HttpClient klients = jauns HttpClient ();

var result = client.GetAsync (new Uri ("// localhost // api / default /")). Rezultāts;

virknes atbildeMessage = result.Content.ReadAsStringAsync (). Rezultāts;

Assert.IsTrue (result.IsSuccessStatusCode);

        }

Veicot testa metodi, ziņojums "Noklusējuma tīmekļa API kontroliera iekšpusē ..." tiek atgriezts kā atbildes ziņojums, un tests tiek nokārtots. Ak! Mēs patiešām izveidojām ziņojumu apstrādātāju, taču mums tas vēl jāreģistrē ziņojumu apstrādes cauruļvadā.

Tagad jums būs jāinformē Web API infrastruktūra, kur pastāv jūsu pielāgotais apdarinātājs. Lai to izdarītu, cauruļvadā jāreģistrē pielāgotais apdarinātājs. Jūs varat reģistrēt tikko izveidoto pielāgoto ziņojumu apstrādātāju WebApiConfig klases reģistrēšanas metodē, kā parādīts zemāk.

public static void Register (HttpConfiguration config)

{

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

}

Atkārtoti izpildot testa metodi, teksta ziņojums "Inside the logging message handler ..." tiek atgriezts kā atbildes ziņojums, un tests tiek izturēts.

Ņemiet vērā, ka ziņojumu apstrādes cauruļvadā var reģistrēt arī vairākus ziņojumu apstrādātājus, kā parādīts zemāk esošajā koda fragmentā.

public static void Register (HttpConfiguration config)

{

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

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

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

}

Ziņojumu apstrādātāji tiks izpildīti tādā secībā, kādā tie ir pievienoti cauruļvadam, un atbilde tiks atgriezta apgrieztā secībā. Citiem vārdiem sakot, ienākošā pieprasījuma laikā ziņojumu apstrādātāji tiek izpildīti tādā secībā, kādā tie ir reģistrēti. Izejošās atbildes laikā process tiek vienkārši mainīts. Tātad ziņojumu apstrādātāji tiek izpildīti apgrieztā secībā pēc to reģistrācijas cauruļvadā.

Varat arī ieviest ziņojumu apstrādātāju, kas pārbauda ienākošo pieprasījumu un pārbauda, ​​vai pieprasījumā ir derīga api atslēga. Ja api atslēga nav vai nav derīga, tā atgriež atbilstošu kļūdas ziņojumu. Šis kodu saraksts parāda, kā jūs to varat izdarīt - es atstāju jums uzrakstīt kodu, lai vienalga apstiprinātu api atslēgu.

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

        {

virknes atslēga = HttpUtility.ParseQueryString (request.RequestUri.Query) .Get ("atslēga");

string errorMessage = "Lai piekļūtu Web API, jums jānorāda api atslēga.";

mēģiniet

            {

ja (! string.IsNullOrWhiteSpace (atslēga))

                {

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

                }

cits

                {

HttpResponseMessage response = pieprasījums.CreateErrorResponse (HttpStatusCode.Forbidden, errorMessage);

mest jaunu HttpResponseException (atbilde);

                }

            }

noķert

            {

HttpResponseMessage response = request.CreateErrorResponse (HttpStatusCode.InternalServerError, "Notika neparedzēta kļūda ...");

mest jaunu HttpResponseException (atbilde);

            }

        }

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