How to use your own IHttpHandlers without changing IIS settings

As I know there are a lot of developers that do not have a internet server with full access to the IIS (f.e. using a administrator website or remote desktop). You have to change the IIS settings for the new file extension.

Yesterday I found a good solution on how to use a special file extension without changing IIS settings or to put settings in the web.config.

After the .NET installation you will find some file extensions already in the list. One of them will be .ASHX (ASP.NET Handler). In this file you have to write the class where you have put your IHttpHandler:

<%@ WebHandler language="c#" codebehind="MyChart.aspx.cs" class="WebApplication1.MyChart" %>

As you can see in the above sample you can use codebehind like in webforms or webservices.

My IHttpHandler sample application will allow you to use a similar technic like the new .ASIX file extension in Microsoft .NET 2.0 (beta).

using System;
using
System.Drawing;
using
System.Drawing.Drawing2D;
using
System.Web;
namespace
WebApplication1
{
  public delegate void
RenderEventHandler(Graphics g, System.EventArgs e);

  public
class
MyHttpHandler : IHttpHandler
  {
    public event
RenderEventHandler Render;
    protected int
Width = 100;
    protected int Height = 100;

    public MyHttpHandler()
    {
      OnInit(
new
EventArgs());
    }

    protected virtual void OnInit(EventArgs e)
    {}

    public void ProcessRequest(HttpContext context)
    {
      Bitmap bmp =
new
Bitmap(Width, Height);
      Graphics g = Graphics.FromImage(bmp);
      g.FillRectangle(
new
SolidBrush(Color.White), 0, 0, bmp.Width, bmp.Height);

      if(Render != null)
      {
        Render(g, new
EventArgs());
      }

      bmp.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
      g.Dispose();
      bmp.Dispose();
      g =  null;
      bmp =
null;
    }

    public bool IsReusable
    {
      get{ return false
; }
    }
  }
}

Now, you can draw a image directly in your codebehind file. As you can see in the following codebehind file for the .ASHX you have a Render event that will be called from the IHttpHandler.

using System;
using
System.Drawing;
using
System.Web;
namespace
WebApplication1
{
  public class
MyChart : MyHttpHandler
  {

  private void Page_Render(Graphics g, System.EventArgs e)
  {
    g.DrawLine(
new
Pen(Color.Black), 0, 0, 100, 100);
  }

  override protected void OnInit(EventArgs e)
  {
    InitializeComponent();
    base
.OnInit(e);
  }

  private void InitializeComponent()
  {
    this
.Width = 100;
    this
.Height = 100;

    this.Render += new RenderEventHandler(this.Page_Render);
  }
}

Based on my article Math Berther has build a second solution on how to use own HttpHandlers:
http://www.mattberther.com/2004/07/000510.html

No Comments