Файл .ashx начинается с директивы WebHandler. Директива WebHandler показывает класс, который нужно представить через этот файл. Например:
<%@ WebHandler Language="C#" Class="HttpExtensions.SimpleHandler" %>
Имя класса может соответствовать классу в каталоге App_Code или классу в ссылаемой сборке. Как вариант, вы можете определить класс прямо в файле .ashx (под директивой WebHandler). В любом случае, когда пользователь запросит файл .ashx, будет выполнен соответствующий класс обработчика HTTP. Если вы сохраните предыдущий пример в виде файла simple.ashx, то всякий раз при запросе клиентом simple.ashx будет выполняться ваш специальный обработчик Web. Более того, тип файла .ashx регистрируется в IIS, поэтому вам не придется конфигурировать IIS при развертывании приложения.
Использовать конфигурационный файл или файл .ashx — дело вкуса. Однако файлы .ashx обычно применяются для более простых расширений, которые разрабатываются для одного Web-приложения. Конфигурационные файлы тоже дают некоторую степень гибкости. Например, вы можете зарегистрировать обработчик HTTP для того, чтобы работать с запросами, заканчивающимися данным расширением, тогда как файл .ashx обслуживает запрос только тогда, когда он имеет специфическое имя файла. Также вы можете зарегистрировать обработчик HTTP для множества приложений (регистрируя его в файле web.config и устанавливая сборку в GAC). Чтобы добиться того же эффекта с помощью файла .ashx, потребуется скопировать файл .ashx в каждый виртуальный каталог.
В предыдущем примере обработчик HTTP просто возвращал блок статического HTML. Однако к созданию обработчика можно подойти творчески. Например, вы можете прочитать данные, отправленные странице или заданные в строке запроса, и использовать их для настройки сгенерированных выходных данных. Далее показан более сложный пример кода, который отображает исходный код для запрашиваемого файла. Он использует поддержку ввода-вывода файла из пространства имен System.IO.
using System;
using System.Web;
using System.IO;
namespace HttpExtensions
{
public class SourceHandler : IHttpHandler
{
public void ProcessRequest(System.Web.HttpContext context)
{
// Make the HTTP context objects easily available.
HttpResponse response = context.Response;
HttpRequest request = context.Request;
HttpServerUtility server = context.Server;
response.Write("<html><body>");
// Get the name of the requested file.
предыдущая следующая страница оглавление
246