Файл .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

В предыдущем примере обработчик 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

Hosted by uCoz