ASHX file - Web handler file
ASHX file - Web handler file
A web handler file works just like an aspx file except
you are one step back away from the messy browser level where HTML and C# mix. One reason you would write an .ashx
file instead of an .aspx file is that your output is not going to a browser but
to an xml-consuming client of some kind. Working with .ashx keeps you away from
all the browser technology you don't need in this case. Notice that you have to
include the IsReusable property.
<% @ webhandler language="C#"
class="AverageHandler" %>
using
System;
using
System.Web;
public
class AverageHandler : IHttpHandler
{
public bool IsReusable
{ get { return true; } }
public void ProcessRequest(HttpContext ctx)
{
ctx.Response.Write("hello");
}
}
ASP.NET ASHX Handler
Some ASP.NET files are dynamically generated. They are generated with C#
code or disk resources. These files do not require web forms. Instead, an ASHX generic handler is ideal. It can dynamically
return an image from a query string, write XML, or any other
data.
This C# tutorial uses the ASHX file format in the ASP.NET
framework.
Introduction
First, we review the goal in using ASHX files in the ASP.NET web
development framework. What we will be able to do is use the ASHX file in a URL,
and have it return content dynamically. We will use the query string, and the
final URLs will look like this:
http://www.dotnetperls.com/?file=name
Getting started. This
part lists the steps you can take to add a new ASHX file. To do this, open your
ASP.NET web site. Go to the Website menu and click on the very first menu item
there, "Add New Item...". This will present the Add New Item dialog box. Select
the "Generic Handler" item, and you will get a new file with some code in it
called Handler.ashx.
Autogenerated code
Here we note what the autogenerated code in the ASHX file does. It
defines two parts of the IHttpHandler interface. The important part is
ProcessRequest(), which will be invoked whenever the Handler.ashx file is
requested or pointed to. You shouldn't modify the interface inheritance or
remove either of the members.
urlMappings
It is often desirable to map an older URL or path to your new ASHX file.
For backwards compatibility and for search engine optimization, you will
probably want the new handler to take over an old URL in your site. To do this,
use urlMappings; alternatively, you can use more complex RewritePath
methods.
Part of Web.config file [XML]
...
URL mappings. The above
Web.config markup will automatically link one URL to another. Now, when the
Default.aspx page is requested, your Handler.ashx file will take over. This
means you can map the default page in a directory to your handler.
urlMappings for
Redirects
Add example image
Here we mention what you can do with the ASHX file involving images. Find
your favorite image on your disk or on the Internet and add it to your website
project. For my example, the image I chose was "Flower1.png". Next we will use
this image in the Handler.ashx file.
Modify Handler.ashx
Your handler has two parts, and here we must modify the ProcessRequest()
method. We can change the ContentType of the file and the Response content.
Modify your Handler.ashx to be similar to the following, with your image
ContentType and file name.
ASHX code-behind file [C#] <%@ WebHandler Language="C#" Class="Handler" %> using System; using System.Web; public class Handler : IHttpHandler { public void ProcessRequest (HttpContext context) { // Comment out these lines first: // context.Response.ContentType = "text/plain"; // context.Response.Write("Hello World"); context.Response.ContentType = "image/png"; context.Response.WriteFile("~/Flower1.png"); } public bool IsReusable { get { return false; } } }
Test handler
Here we test the new configuration and ASHX file on the local machine.
Now click the green arrow to run your website on the development server. You
should see the image in your browser. This is the result of writing the image to
the response in the handler.
Add functionality
The example here so far is relatively useless. All it does is allow us to
pipe an image through an ASHX handler. Note that you can add any logging code or
referrer logic to the handler in the C# language. Developers commonly need to
use the QueryString collection on the Request. You can use the
Request.QueryString in the Handler just like you would on any ASPX web form
page.
ASHX modified code-behind [C#] <%@ WebHandler Language="C#" Class="Handler" %> using System; using System.Web; public class Handler : IHttpHandler { public void ProcessRequest (HttpContext context) { HttpResponse r = context.Response; r.ContentType = "image/png"; // // Write the requested image // string file = context.Request.QueryString["file"]; if (file == "logo") { r.WriteFile("Logo1.png"); } else { r.WriteFile("Flower1.png"); } } public bool IsReusable { get { return false; } } }
What this does. The above
code receives requests and then returns a different file based on the
QueryString collection value. It will return one of two images from the two
query strings. The strings it returns are shown next here.
URL = http://www.dotnetperls.com/?file=logo
File query string: logo
File written: Logo1.png
URL = http://www.dotnetperls.com/?file=flower
File query string: flower
File written: Flower1.png
Test query string
Does all this really work? Yes, it does, but it is always important to
test it. Open your browser and on the path add query strings like shown in the
above table. What happens is that ASP.NET internally maps the Default.aspx page
to your Handler.ashx. Then, it receives the query string and write the
appropriate file.
Uses
The code here could be used as a hit tracker that counts visitors and
logs referrers. This could provide a more accurate visit count than server logs,
because of browser and bot differences.
Handlers versus web pages. ASP.NET web forms inherit from the Page
class. This provides them with many events and a very detailed initialization
and event model. You don't need that for dynamic images, XML, or binary
files.
Performance
You are likely wondering if there is any performance advantage or change
to using ASHX files. ASHX files are less complex and they do not involve as many
events. As you can imagine firing more than ten events each time a request is
handled is a fair amount more expensive than only firing one event. Therefore,
there will be some performance advantage to using ASHX files where
possible.
Choose handlers
Here I want to propose some guidelines about when to use custom handlers
and when to use ASPX web form pages. Handlers are better for binary data, and
web forms are best for rapid development.
Use Web Forms...
If you have simple HTML pages
ASP.NET custom controls
Simple dynamic pages
Use handlers...
If you have binary files
Dynamic image views
Performance-critical web pages
XML files
Minimal web pages
Control trees
In the ASP.NET Framework, web forms use a concept called control trees
where the parts of web pages are stored in an object model. Use custom handlers
when you do not require the custom control tree or the whole HTML web form
framework. This will result in greater performance and much simpler code to
debug.
IsReusable property
I do not know precisely what the IsReusable property does in ASP.NET, as
much of the supporting code is not in the ASHX file itself. My reading indicates
that it can improve performance and decrease memory pressure by not destroying
the handler repeatedly.
Summary
We saw how you can use ASHX custom handlers in your ASP.NET website. This
could be modified to fill in many different important web site functions.
Combine urlMappings with query strings on custom handlers to greatly simplify
and streamline your back-end web site code.
Comments