Asp.Net IHttpHandler esitelty ASP.NET kaksi yleisesti käytettyä käsittelyliitäntää Http-pyyntöihin vastattaessa ovat IHttpHandler ja IHttpModule.
Yleisesti ottaen IHttpHandleria käytetään käsittelemään tietynlaista pyyntöä, kuten *.asp, *.aspx-tiedostojen erillistä käsittelyä. IHttpModulea käytetään yleensä operaatioiden käsittelyyn, jotka ovat yleisesti pyynnössä vaadittuja, kuten suorittamaan joitakin samoja tarkistuksia pyyntösivulla.
Katsotaanpa IIS-palvelimen käsittelyvaiheita, kun tehdään vastaava HTTP-pyyntö. ASP.NET käyttää pipeline-käsitettä, mikä tarkoittaa, että jokaisella ASP.NET-pyynnöllä on sarja vastaavia operaatioita IIS:ssä, jolloin muodostuu rivimäinen sekvenssi.
ASP.NET putkiston esittely
Katsotaanpa putkiston käsittelyaikakaaviota:
Kuten kuvasta näkyy, pyynnön saapumisen jälkeen toteutus käsitellään HttpModule ja sitten HttpHandlerin ProcessRequest()-menetelmä kutsutaan antamaan tarkka vastaus. Siksi ei ole vaikea ymmärtää, miksi luokkakohtaisten pyyntöjen käsittely sijoitetaan HttpHandler-luokkaan samalla kun tehdään tarkistuksia, jotka ovat yhteisiä kaikille HttpModule-pyynnöille.
Koodikäytäntö
IHttpHandler
Kirjoittaja törmäsi äskettäin IHttpHandlerin käyttöön asiakasrajapintakutsujen käsittelyyn projektissa, joten keskustellaan lyhyesti yksinkertaisesta käyttöliittymäsuunnittelusta, joka perustuu IHttpHandleriin.
IHttpHandler-käyttöliittymässä on vain kaksi jäsentä:
IsReusable-attribuutti tunnistaa, voiko HttpHandler-objektia käyttää muissa instansseissa, ja yleensä asetamme sen True-arvoon. ProcessRequest()-metodi on tietty vastaus pyyntöön, ja meidän tarvitsee vain laittaa tietty liiketoimintalogiikkaoperaatio tähän.
Luo ensin uusi verkkoprojekti ja lisää Handler-luokka:
RayHandler-luokka toteuttaa IHttpHandler-rajapinnan ProcessRequest()-funktion, joka on vain suora ulostulo tekstistä.
Sitten meidän täytyy lisätä seuraava konfiguraatio Web.config-tiedostoon:
path ilmaisee URL-osuman, kuten *.ray, mikä tarkoittaa, että Handler vastaa URL-pyyntöihin, jotka päättyvät ".ray", verbi osoittaa pyyntömetodin, kuten Get/Post, ja * tarkoittaa, että se vastaa kaikkia. type ilmaisee Handler-luokan tyypin, WebApplication2.RayHandler on luokan nimi, WebApplication2 viittaa kokoonpanon nimeen Bin-hakemistossa, esimerkiksi assemblyn nimi esimerkissä on WebApplication2.dll, eikä suffiksinimeä tarvitse määritellä tässä.
Käynnistä sivusto, syötä URL, joka päättyy ".ray", ja näet seuraavan tuloksen:
IHttpHandlerFactoryn yleiskatsaus
Joskus joudumme käsittelemään useita eri päätteitä, joista yksi vastaa Handler-luokkaa, ja tältä Web.config-tiedostomme näyttää:
Jos meillä on paljon HttpHandler-toteutusluokkia, Web.config-tiedostojen konfiguraatio näyttää varmasti monisanaiselta. Tai joissain tapauksissa, kun voimme määrittää vain, mikä Handler vastaa ohjelman ollessa käynnissä, meidän täytyy käyttää IHttpHandlerFactorya.
IHttpHandlerFactory määritellään seuraavasti:
Niiden joukossa:
GetHandler(): Palauttaa instansin, joka toteuttaa IHttpHandler-rajapinnan; ReleaseHandler(): Mahdollistaa Factoryn uudelleenkäytön olemassa olevaa Handler-instanssia. Otetaan yllä olevat säde- ja rss-pyynnöt esimerkiksi, toteuta tehdasluokka:
Tässä tapauksessa Web.configin konfiguraatio on seuraava:
Tässä vaiheessa Factory-luokan käyttö eri tiettyjen käsittelijöiden kanssa on käytössä, mikä yksinkertaistaa konfiguraatiota.
Skaalautuva IHttpHandlerFactory
Yllä olevassa toteutuksessa, jos ohjelman täytyy tulevaisuudessa lisätä uusi päätteiden käsittelymenetelmä, sen täytyy muuttaa Switch-lausetta GetHandler(), mikä voi myös aiheuttaa virheitä tai muita tietoturvariskejä. Joten, onko mahdollista pitää HandlerFactory-luokka muuttumattomana myöhemmissä laajennuksissa?
Vastaus on ehdottomasti kyllä. Lukijoiden, jotka tuntevat suunnittelumallin, tulisi ymmärtää, että kyseessä on yksinkertainen tehdasmalli, ja aiempien toimintojen saavuttamiseksi voimme käyttää suunnittelutilaa nimeltä advanced points.
Tässä voimme myös käyttää C#-kielen kieliominaisuutta – heijastusta. C#:n heijastusmekanismin avulla heijastamme vastaavaa Hanlder-tyyppiä URL-osoitteen suffiksin mukaan, kunhan olemme samaa mieltä URL-suffiksin nimen ja käsittelijän luokan nimen välisestä vastaavuudesta.
Esimerkiksi kirjoitamme GetHandler():n uudelleen seuraavasti:
Tässä tapauksessa sinun tarvitsee vain laittaa Handler-luokka metodiin samaan nimialueeseen kuin HandlerFactory-luokka ja konfiguroida se oikein Web.config-tiedostossa. Esimerkiksi, jos RayHandler-luokka on olemassa, seuraava konfiguraatio tulisi lisätä automaattisesti vastaavaksi:
yhteenveto Tämä artikkeli esittelee lyhyesti IHttpHandlerin käytön vuonna ASP.NET, tarjoaa IHttpHandlerFactoryn toteutuksen useiden Handler-pyyntöjen käsittelyssä ja lopuksi parantaa skaalautuvaa monipyyntöistä Handler-toteutusta C#:n heijastusmekanismin avulla.
|