Asp.Net IHttpHandler introdusert ASP.NET to ofte brukte behandlingsgrensesnittene når man svarer på Http-forespørsler er IHttpHandler og IHttpModule.
Generelt brukes IHttpHandler til å håndtere en spesifikk type forespørsel, som for eksempel separat behandling av hver *.asp, *.aspx fil. IHttpModule brukes vanligvis til å håndtere operasjoner som vanligvis kreves for forespørselen, som å utføre noen av de samme sjekkene på forespørselssiden.
La oss se på behandlingstrinnene til IIS-serveren når den tilhørende HTTP-forespørselen forestår. ASP.NET har konseptet pipeline, som betyr at hver ASP.NET forespørsel vil ha en serie tilsvarende operasjoner i IIS for å danne en linjelignende sekvens.
ASP.NET Pipeline-introduksjon
La oss se på behandlingstidsdiagrammet for rørledningen:
Som det fremgår av figuren, etter at forespørselen har ankommet, behandles implementasjonen av HttpModule, og deretter kalles ProcessRequest()-metoden i HttpHandler for å gi det spesifikke svaret. Derfor er det ikke vanskelig å se hvorfor håndteringen av klasse-spesifikke forespørsler plasseres i HttpHandler-klassen når man gjør noen sjekker som er felles for alle forespørsler i HttpModule.
Kodepraksis
IHttpHandler
Forfatteren kom nylig over bruken av IHttpHandler for å håndtere klientgrensesnittkall i prosjektet, så la oss kort diskutere det enkle grensesnittdesignet basert på IHttpHandler.
IHttpHandler-grensesnittet har kun to medlemmer:
IsReusable-attributtet identifiserer om HttpHandler-objektet kan brukes av andre instanser, og vi setter det vanligvis til True. ProcessRequest()-metoden er et spesifikt svar på forespørselen, og vi trenger bare å plassere den spesifikke forretningslogikkoperasjonen her.
Først, opprett et nytt webprosjekt og legg til en Handler-klasse:
RayHandler-klassen implementerer ProcessRequest()-funksjonen i IHttpHandler-grensesnittet, som bare er en direkte utdata av et tekststykke.
Deretter må vi legge til følgende konfigurasjon i Web.config-filen:
path indikerer URL-matching, som *.ray, som betyr at Handleren vil svare på URL-forespørsler som ender på ".ray", verb angir forespørselsmetoden, som Get/Post, og * betyr at det matcher alle. type angir typen Handler-klasse, WebApplication2.RayHandler er klassenavnet, WebApplication2 refererer til navnet på samlingen i Bin-katalogen, for eksempel er assemblernavnet i eksempelet WebApplication2.dll, og det er ikke nødvendig å definere et suffiksnavn her.
Start siden, skriv inn URL-en som ender på ".ray", og du kan se følgende resultat:
Oversikt over IHttpHandlerFactory
Noen ganger må vi håndtere flere forskjellige suffikser, ett suffiks tilsvarer en Handler-klasse, og slik ser Web.config-filen vår ut:
Hvis vi har mange HttpHandler-implementeringsklasser, vil Web.config-filkonfigurasjonen vår nødvendigvis se ordrik ut. Eller i noen tilfeller, når vi bare kan avgjøre hvilken Handler som svarer når programmet kjører, må vi bruke IHttpHandlerFactory.
IHttpHandlerFactory er definert som følger:
Blant dem:
GetHandler(): Returnerer en instans som implementerer IHttpHandler-grensesnittet; ReleaseHandler(): Gjør det mulig for Factory å gjenbruke en eksisterende Handler-instans. Ta de ovennevnte ray- og rss-forespørslene som eksempel, implementer Factory-klassen:
I dette tilfellet er konfigurasjonen i Web.config som følger:
På dette tidspunktet implementeres funksjonen med å bruke Factory-klassen for å tilsvare ulike spesifikke håndterere, noe som forenkler konfigurasjonen.
Skalerbar IHttpHandlerFactory
I den ovennevnte implementeringen, hvis programmet trenger å legge til en ny suffikshåndteringsmetode i fremtiden, må det endre Switch-setningen i GetHandler(), noe som også kan forårsake feil eller medføre andre sikkerhetsrisikoer. Så, er det mulig å beholde HandlerFactory-klassen uendret for senere utvidelser?
Svaret er definitivt ja. Lesere som er kjent med designmønsteret bør forstå at dette er et enkelt fabrikkmønster, og for å oppnå de tidligere funksjonene kan vi bruke designmodusen kalt avanserte punkter.
Og her kan vi også bruke språkfunksjonen til C#-språket – refleksjon. Gjennom refleksjonsmekanismen i C# reflekterer vi den tilsvarende Hanlder-typen i henhold til suffikset til URL-en, så lenge vi er enige om samsvaret mellom suffiksnavnet til URL-en og klassenavnet til Handleren.
For eksempel omskriver vi GetHandler() som følger:
I dette tilfellet trenger du bare å legge Handler-klassen i metoden under samme navnerom som HandlerFactory-klassen og konfigurere den korrekt i Web.config. For eksempel, hvis det finnes en RayHandler-klasse, bør følgende konfigurasjon legges til for automatisk å matche:
sammendrag Denne artikkelen introduserer kort bruken av IHttpHandler i ASP.NET, gir implementering av IHttpHandlerFactory i behandling av flere Handler-forespørsler, og forbedrer til slutt en skalerbar multi-forespørsel Handler-implementering ved bruk av refleksjonsmekanismen i C#.
|