Ohjelmointi

Kuinka työskennellä viestinkäsittelijöiden kanssa Web-sovellusliittymässä

Web-sovellusliittymän viestinkäsittelijät tarjoavat sinulle mahdollisuuden käsitellä, muokata tai hylätä saapuvia pyyntöjä ennen kuin ne saapuvat HttpControllerDispatcheriin. Viestinkäsittelijät suoritetaan paljon aikaisemmin pyyntöjen käsittelyssä, joten ne ovat loistava paikka toteuttaa monialaisia ​​huolenaiheita Web-sovellusliittymässä.

Mukautetun viestinkäsittelijän käyttöönotto

Kaikki viestinkäsittelijät ovat peräisin luokasta HttpMessageHandler. Rakentaaksesi oman viestinkäsittelijän, sinun tulisi laajentaa DelegatingHandler-luokkaa. Huomaa, että DelegatingHandler-luokka puolestaan ​​on peräisin HttpMessageHandler-luokasta.

Harkitse seuraavaa Web-sovellusliittymän ohjainta.

public class DefaultController: ApiController

    {

public HttpResponseMessage Get ()

        {

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

        }

    }

Viestinkäsittelijän luomiseksi sinun on laajennettava DelegatingHandler-luokkaa ja ohitettava SendAsync-menetelmä.

julkisen luokan käsittelijä: käsittelijän delegointi

    {

suojattu ohittaa asynkronointi Tehtävä SendAsync (HttpRequestMessage-pyyntö, CancellationToken cancellationToken)

        {

return base.SendAsync (pyyntö, peruutusToken);

        }

    }

Web-sovellusliittymän pyyntöjen käsittelyssä on muutama sisäänrakennettu viestinkäsittelijä. Näitä ovat seuraavat:

  • HttpServer - tätä käytetään pyynnön hakemiseen isännältä
  • HttpRoutingDispatcher - tätä käytetään lähettämään pyyntö määritetyn reitin perusteella
  • HttpControllerDispatcher - tätä käytetään lähettämään pyyntö kyseiselle ohjaimelle

Voit lisätä viestinkäsittelijöitä putkilinjalle yhden tai useamman seuraavista toiminnoista.

  • Suorita todennus ja valtuutus
  • Kirjaa saapuvat pyynnöt ja lähtevät vastaukset
  • Lisää vastauksen otsikot vastausobjekteihin
  • Lue tai muokkaa pyynnön otsikoita

Seuraava koodinpätkä osoittaa, kuinka yksinkertainen viestinkäsittelijä voidaan ottaa käyttöön Web-sovellusliittymässä.

julkisen luokan käsittelijä: käsittelijän delegointi

{

suojattu asynkronointi ohittaa tehtävän SendAsync (HttpRequestMessage request, CancellationToken cancellationToken)

        {

var response = uusi HttpResponseMessage (HttpStatusCode.OK)

            {

Content = new StringContent ("Viestinkäsittelijän sisällä ...")

            };

var task = uusi TaskCompletionSource ();

task.SetResult (vastaus);

palaa odota tehtävää.Task;

        }

}

Viestinkäsittelijä ei käsittele pyyntöviestiä - se luo vastausviestin ja palauttaa sen sitten. Voit myös soittaa SendAsync-menetelmän perusversioon, jos et halua tehdä mitään saapuvan pyynnön kanssa, kuten alla olevassa koodiluettelossa näkyy.

julkisen luokan käsittelijä: käsittelijän delegointi

{

suojattu asynkronointi ohittaa tehtävän SendAsync (HttpRequestMessage request, CancellationToken cancellationToken)

        {

paluu odottaa tukiasemaa.SendAsync (request, cancellationToken);

        }

}

Voit myös kirjoittaa koodin kirjaamaan Http-pyynnöt ja SendAsync-menetelmässä menevät vastaukset.

Voit suorittaa Web-sovellusliittymän suorittamalla alla kuvatun kaltaisen testimenetelmän.

 [Testausmenetelmä]

public void WebAPIControllerTest ()

        {

HttpClient-asiakas = uusi HttpClient ();

var result = asiakas.GetAsync (uusi Uri ("// paikallinen isäntä // api / oletus /")). Tulos;

merkkijono responseMessage = result.Content.ReadAsStringAsync (). Tulos;

Assert.IsTrue (result.IsSuccessStatusCode);

        }

Kun suoritat testimenetelmän, viesti "Inside the Default Web API Controller ..." palautetaan vastausviestinä ja testi läpäisee. Vai niin! Luomme viestinkäsittelijän, mutta emme ole vielä rekisteröineet sitä viestien käsittelyyn.

Sinun on nyt ilmoitettava Web-sovellusliittymäinfrastruktuurille, missä mukautettu käsittelijäsi on. Tätä varten sinun on rekisteröitävä mukautettu käsittelijäsi. Voit rekisteröidä juuri luomamme mukautetun viestinkäsittelijän WebApiConfig-luokan Rekisteröintimenetelmään alla esitetyllä tavalla.

public static void Register (HttpConfiguration config)

{

GlobalConfiguration.Configuration.MessageHandlers.Add (uusi käsittelijä ());

}

Kun suoritat testimenetelmän uudelleen, tekstiviesti "Sisään loki-viestin käsittelijän sisällä" palautetaan vastausviestinä ja testi läpäisee.

Huomaa, että voit myös rekisteröidä useita viestinkäsittelijöitä viestinkäsittelyputkelle alla olevan koodinpätkän mukaisesti.

public static void Register (HttpConfiguration config)

{

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

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

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

}

Viestinkäsittelijät suoritetaan siinä järjestyksessä, jossa ne on lisätty putkilinjaan, ja vastaus palautetaan päinvastaisessa järjestyksessä. Toisin sanoen saapuvan pyynnön ajankohtana viestinkäsittelijät suoritetaan siinä järjestyksessä, jossa ne on rekisteröity. Lähtevän vastauksen aikana prosessi on vain päinvastainen. Joten sanomakäsittelijät suoritetaan päinvastaisessa järjestyksessä kuin niiden rekisteröinti putkilinjalle.

Voit myös ottaa käyttöön viestinkäsittelijän, joka tarkastaa saapuvan pyynnön ja tarkistaa, onko pyyntöön kelvollinen api-avain. Jos api-avainta ei ole tai se ei ole kelvollinen, se palauttaa asianmukaisen virhesanoman. Seuraava koodiluettelo näyttää, kuinka voit tehdä tämän - jätän sinun kirjoittaa koodin API-avaimen vahvistamiseksi joka tapauksessa.

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

        {

merkkijonoavain = HttpUtility.ParseQueryString (request.RequestUri.Query) .Get ("avain");

string errorMessage = "Sinun on määritettävä api-avain, jotta pääset Web-sovellusliittymään.";

yrittää

            {

if (! string.IsNullOrWhiteSpace (avain))

                {

return base.SendAsync (pyyntö, peruutusToken);

                }

muu

                {

HttpResponseMessage response = request.CreateErrorResponse (HttpStatusCode.Forbidden, errorMessage);

heittää uusi HttpResponseException (vastaus);

                }

            }

saada kiinni

            {

HttpResponseMessage response = request.CreateErrorResponse (HttpStatusCode.InternalServerError, "Odottamaton virhe tapahtui ...");

heittää uusi HttpResponseException (vastaus);

            }

        }

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