Michells Mesterværk

HttpModules i IIS 7.x

by Administrator 16. November 2009 11:31

Jeg har tidligere skrevet en post omkring HttpHandlers i IIS 7.x. Denne gang vil jeg forsøge at forklare jer lidt omkring hvad et HttpModule er og hvad man kan få ud af at bruge det.

Et HttpModule er, ligsom en HttpHandler en mulighed for at extende Windows webserveren, IIS. Forskellen på en Handler og et Module er at man i et Module for det første er et ligner ISAPI filter hvorimod en Handler ligner en ISAPI extension. Når jeg skriver “ligner” i denne sammenhæng er det fordi, at ISAPI filtre samt extensions ikke længere behøver at være skrevet i unmanaged kode, og at både “request pipelinen” samt hele IISn er lavet om, så man nu kan tilgå den og dens features via ren .NET. På den måde kan man altså extende sin webserver med lethed.

Inden vi går videre skal du måske lige have en opfrisker….kan du huske hvad der sker når der bliver lavet et request til f.eks ASP.NET ?

En af de fede ting ved IIS 7.x er at ASP.NET runtimen er blevet bygget ind i webserveren. Det betyder bla. at der er én og kun én “request cycle pipeline” for alle requests. Det kommer vi til at se nærmere på lige om lidt.

Du skal bruge HttpModules fordi…

1. Den samme pipeline raiser alle de events som er bygget ind i HttpApplication typen. Det gør det muligt at bygge egne HTTP moduler og handlers til IIS med .NET.

2. Både (un)managed HTTP moduler og handlers kan sættes på webserver, website eller applikations niveau.

3. Managed HTTP moduler kan kaldes på hvilket som helst tidspunkt i "request cycle pipelinen”. Både før og efter serveren rent faktisk gør noget ved selve requestet.

Lad os se på hvordan du laver et HttpModule. Du skal ligsom med en HttpHandler implementere et interface. Interfacet for HttpModuler hedder IHttpModule og giver dig 2 ting. Init og Dispose.

Jeg har stjålet lidt kode fra Mads Kristensens blog da han har skrevet utrolig meget omkring både HttpHandlers og HttpModules.

using System;
using System.Web;
using System.Configuration;
using System.Collections.Specialized;

public class IpBlockingModule : IHttpModule
{
void IHttpModule.Dispose()
{
// Nothing to dispose;
}

void IHttpModule.Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}

private void context_BeginRequest(object sender, EventArgs e)
{
string ip = HttpContext.Current.Request.UserHostAddress;
if (_IpAdresses.Contains(ip))
{
HttpContext.Current.Response.StatusCode = 403;
HttpContext.Current.Response.End();
}
}

private static StringCollection _IpAdresses = FillBlockedIps();

private static StringCollection FillBlockedIps()
{
StringCollection col = new StringCollection();
string raw = ConfigurationManager.AppSettings.Get("blockip");
raw = raw.Replace(",", ";");
raw = raw.Replace(" ", ";");

foreach (string ip in raw.Split(';'))
{
col.Add(ip.Trim());
}

return col;
}
}

Ovenstående HttpModule er ikke til noget nytte medmindre du også har implementeret den rigtige appsetting samt registret den i din applikation eller på website/server niveau.

<appSettings> 
<add key="blockip" value="44.0.234.122, 23.4.9.231"/>
</appSettings>

<system.webServer>
<modules>
<add name="IpBlocking" type="IpBlockingModule" />
</modules>
</system.webServer>
 
Som i kan se så er der lavet et “hook” ind i request pipelinen, ved den event der hedder BeginRequest (kig i Init metoden). Dette modul bliver tilføjet til den bunken med de andre moduler som et request skal igennem, og i dette tilfælde vil hvert request blive tjekket med denne IpBlocking rutine som Mads har været så rar at skrive.
 
Hvis du ikke allerede har extended din IIS webserver så er det med at komme igang ;0)

Tags:

VS2010

Comments

11/18/2009 12:39:38 PM #

Brian

Jeg indrømmer, at jeg ikke har erfaring med IHttpModule, så muligvis er der gode forklaringer på det hele, men jeg undrer mig lidt over et par ting ved koden.

Kunne man ikke bruge Dispose til at afkoble sin event handler fra context? Eftersom context_BeginRequest er private, kan context-instansen jo ikke selv gøre det efterfølgende.  

Er der en grund til at bruge StringCollection fremfor List<string>?

Hele Replace/Split/Trim-konstruktionen kunne nok laves lidt simplere.

Brian Denmark

11/18/2009 12:57:09 PM #

Daniel

@Brian spørg Mads da han har skrevet koden Smile

Arh...det føltes rart sige ;)

Daniel Denmark

2/14/2010 1:56:20 PM #

اخبار

Thank you very much for the possibility to have a look into the office. Nice boy, he has got the talent to explain.

اخبار Egypt

2/28/2010 3:14:12 AM #

stock trading

If you are open to having a guest blog poster please  let me know. I will provide  unique content for your blog, thanks.

stock trading United States

2/28/2010 11:30:04 AM #

money

Do have some sort of email system where your blog posts emailed to me?

money United States

3/4/2010 6:21:39 AM #

watch movies online

I love watching movies online, it is way easier than going to the theaters.

watch movies online United States

3/9/2010 8:41:56 PM #

WoW Mobile

Do you know which mobile phone services allow tethering?

WoW Mobile United States

3/17/2010 12:01:35 PM #

arac sorgulama

I admire the valuable information you offer in your articles. I will bookmark your blog and have my children check up here often. I am quite sure they will learn lots of new stuff here than anybody else!

arac sorgulama United States

3/20/2010 3:35:36 PM #

ehliyet

Excellent post.I want to thank you for this informative read, I really appreciate sharing this great post. Keep up your work.

ehliyet Denmark

Add comment


(Will show your Gravatar icon)

(De 3 specielle karaktere i det danske alfabet?)
  Country flag

biuquote
  • Comment
  • Preview
Loading



Powered by BlogEngine.NET 1.6.0.0
Theme by Mads Kristensen