views:

80

answers:

2

I want to write an HttpHandler to redirect traffic to various webpages on the server. The user will type in http://www.thisissupposedtoberedirected.com/site12 and should be redirected to the appropiate site, in this example site version 1.2

I know how to program in ASP.NET and C# but I don't seem to grab the finer detail about website management.
How can I manage to get this done? What should I do in the web.config? I've read this msdn page but it isn't much help.

A: 

1) You need to create a new class that implements IHttpHandler or IHttpAsyncHandler (the latter being when you are very comfortable with managing your own threads). Create your logic there.

2) Then, modify the web.config so that you register your handler:

<system.web>
    <httpHandlers>
      <add verb="*" path="*.htm" type="System.Web.StaticFileHandler"/>
      <add verb="*" path="*.html" type="System.Web.StaticFileHandler"/>
      <add verb="*" path="*.ico" type="System.Web.StaticFileHandler"/>
    </httpHandlers>
</system.web>

This is a sample setup in my web.config - yours may vary slightly.

Now, your HttpHandler should be registered and based on the details provided in your registration in the web.config, when you request certain URLs, you will be mapped to the Handler you created instead of the normal ASP.NET Page Handler.

Additionally, for your specific issue, I wouldn't recommend writing a HttpHandler - I would just do a DNS redirect, or do some lookup in your OnInit code to check the Host Url, and if it is one specified in your DB, you do the redirect yourself based on the configuration data.

Tejs
@Tejs - Be careful, your example only works for IIS6. IIS7 Classic Mode requires an extra entry in another section and IIS7 Integrated Mode uses another section for HttpHandlers all together (ignoring the httpHandlers section all together).
Justin Niessner
Good point - I'm unlucky and that all I get to use is IIS6 =/
Tejs
+3  A: 

HttpHandlers are actually fairly simple components.

First, you need to create a class that inherits either IHttpHandler or IHttpAsyncHandler (for your use, I'd suggest IHttpHandler since there's really no heavy lifting being done).

You then compile the DLL and drop it in the bin folder of your web application.

Now the tricky part. Deploying HttpHandlers in the web.config file is tricky since it's different between IIS6, IIS7 Integrated Mode, and IIS7 Classic Mode. The best place to look is this MSDN page:

How to: Register HTTP Handlers

IIS6

<configuration>
  <system.web>
    <httpHandlers>
      <add verb="*" path="SampleHandler.new" 
        type="SampleHandler, SampleHandlerAssembly" />
    </httpHandlers>
  <system.web>
</configuration>

IIS7 Classic Mode

<configuration>
  <system.web>
    <httpHandlers>
      <add verb="*" path="SampleHandler.new" 
        type="SampleHandler, SampleHandlerAssembly" />
    </httpHandlers>
  <system.web>
  <system.webServer>
    <add name=SampleHandler" verb="*" path="SampleHandler.new" 
      Modules="IsapiModule" 
      scriptProcessor="FrameworkPath\aspnet_isapi.dll"
      resourceType="File" />
  </system.webServer>
</configuration>

IIS7 Integrated Mode

<configuration>
  <system.webServer>
    <handlers>
      <add name="SampleHandler" verb="*" 
        path="SampleHandler.new" 
        type="SampleHandler, SampleHandlerAssembly" 
        resourceType="Unspecified" />
    </handlers>
  <system.webServer>
</configuration>

As you can see, each IIS configuration requires entries in slightly different sections of the web.config file. My suggestion would be to add entries in each location so that IIS configuration changes don't break your HttpHandler.

Justin Niessner
+1 for the different configurations.
Tejs
Do you know what level of trust I need for IIS to complete this task?
D. Veloper