Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_CSharp_5.docx
Скачиваний:
41
Добавлен:
11.05.2015
Размер:
473 Кб
Скачать
☆

5.19. Инфраструктура обработки зАпроса

Рассмотрим стадии обработки клиентских запросов компонентами ASP.NET. Итак, пусть клиент направил запрос, URI которого определяет его как относящийся к ASP.NET. На сервере выполнятся следующие шаги.

  1. Веб-сервер IIS на основании расширения URI принимает решение о вызове библиотеки aspnet_isapi.dll, написанной на обычном (не на управляемом) коде, и передаёт этой библиотеке данные запроса для обработки.

  2. aspnet_isapi.dll запускает (при необходимости) рабочий процесс aspnet_wp.exe, написанный на управляемом коде.

  3. В рамках aspnet_wp.exe вызывается статический метод HttpRuntime.ProcessRequest(), который становится ответственным за обработку запроса. В качестве параметра данный метод принимает объект класса HttpWorkerRequest, совмещающий как данные запроса, так и последующие данные ответа.

  4. Порождается объект класса HttpContext, содержащий отдельные объекты для представления запроса, ответа, сессии и прочие. Подробнее класс HttpContext будет рассмотрен ниже.

  5. Метод HttpApplication.GetApplicationInstance() порождает или возвращает существующий домен для веб-приложения. Дальнейшая работа происходит в рамках этого домена.

  6. Срабатывает цепочка HTTP-модулей, являющихся перехватчиками отдельных событий запроса и (при сформированном ответе) ответа.

  7. Порождается фабрикой классов или выбирается из списка зарегистрированный HTTP-обработчик. Его задача – обработать запрос в зависимости от конкретного расширения URI.

  8. Данные, сформированные обработчиком, передаются в качестве ответа на сервер, отправляющий их клиенту.

Важную роль в процессе обработки HTTP-запроса играет объект класса HttpContext. Он выступает в роли своеобразного «клея», объединяющего все стадии запроса. Табл. 33 содержит описание свойств класса HttpContext.

Таблица 33

Свойства класса HttpContext

Свойство

Описание

AllErrors

Массив объектов Exception, каждый из которых представляет ошибку, происходящую при выполнении запроса

Application

Экземпляр класса HttpApplicationState, содержащий глобальное совместно используемое состояние приложения

ApplicationInstance

Объект HttpApplicationдля текущего запроса, точнее, объект класса, определенного в файлеglobal.asax

Cache

Связанный с текущим запросом объект Cache

Current

Статическое свойство ‑ текущий объект HttpContext

CurrentHandler

Возвращает обработчик текущего запроса 

Error

Возвращает первое исключение, сгенерированное при обработке текущего запроса

Handler

Возвращает и позволяет задать для текущего запроса обработчик HTTP

IsCustomErrorEnabled

Указывает, включена ли для текущего запроса пользовательская обработка ошибок

IsDebuggingEnabled

Указывает, выполняется ли запрос в режиме отладки

Items

Хэш-таблица, которая для модулей и обработчиков HTTP может служить средством совместного доступа к данным

PreviousHandler

Возвращает объект IHttpHandlerродительского обработчика

Profile

Объект, представляющий профиль текущего пользователя 

Request

Экземпляр класса HttpRequest, представляющий текущий запрос HTTP

Response

Экземпляр класса HttpResponse, отправляющий клиенту данные ответа HTTP

Server

Экземпляр класса HttpServerUtility, предоставляющего вспомогательные методы для обработки запросов

Session

Экземпляр класса HttpSessionState, управляющий дан­ными, связанными с конкретным сеансом

SkipAuthorization

Позволяет указать, должен ли модуль, осуществляющий авторизацию на основе URL, пропустить для текущего запроса этап авторизационной проверки. Свойство используется главным образом модулями аутентификации, которым нужно перенаправлять пользователя на страницу, с разрешённым анонимным доступом

Timestamp

Возвращает объект DateTime, представляющий начальный штамп времени текущего запроса

Trace

Объект TraceContextтекущего запроса

User

Объект IPrincipal, представляющий пользователя, от которого поступил запрос

В ASP.NET программист может создавать собственные HTTP-обработчики, производящие непосредственную обработку запрашиваемых ресурсов с определенным расширением. Технически, HTTP-обработчик – это класс, реализующий интерфейс System.Web.IHttpHandler и зарегистрированный в инфраструктуре ASP.NET при помощи конфигурационных файлов.

В качестве примера рассмотрим создание обработчика, который будет перехватывать все запросы к страницам с расширением *.calc и выводить сумму двух чисел, переданных как параметры GET-запроса. Первое, что необходимо выполнить – написать класс с реализацией IHttpHandler. Интерфейс IHttpHandler содержит следующие элементы:

  • void ProcessRequest(HttpContext context) – в этом методе происходит обработка запроса и формирование ответа с использованием данных объекта context;

  • bool IsReusable { get; } – это свойство возвращает true, если один объект-обработчик можно использовать для нескольких запросов.

Наш обработчик будет реализован как класс CalcHandler, размещенный в сборке UserHandlers.dll.

// CalcUserHandler.cs file

using System;

using System.Web;

namespace UserHandlers

{

public class CalcHandler : IHttpHandler

{

public void ProcessRequest(HttpContext context)

{

var objRequest = context.Request;

var result = Int32.Parse(objRequest.Params["p1"]) +

Int32.Parse(objRequest.Params["p2"]);

var objResponse = context.Response;

objResponse.Write("<html><body><h1>");

objResponse.Write(result.ToString());

objResponse.Write("</h1></body></html>");

}

public bool IsReusable

{

get { return true; }

}

}

}

Скомпилированную сборку UserHandlers.dll разместим в каталоге Bin некоего веб-приложения (в случае создания глобальных обработчиков следует использовать GAC).

Теперь зарегистрируем обработчик. Для этого используется секция <httpHandlers> в конфигурационных файлах. Секция может содержать элементы <add>, <remove> и <clear>. Атрибутами <add> являются:

verb – специфицирует глагол протокола HTTP. Можно указать несколько глаголов через запятую (GET, POST) либо использовать символ *;

path – отдельный файл или шаблон файлов (расширение), к которым применяется обработчик;

type – имя класса обработчика и имя сборки, в которой он находится.

Для регистрации нашего обработчика используется такой файл web.config:

<configuration>

<system.web>

<httpHandlers>

<add verb="*" path="*.calc"

type="UserHandlers.CalcHandler, UserHandlers"/>

</httpHandlers>

</system.web>

</configuration>

Кроме регистрации в конфигурационном файле, расширение .calc должно быть зарегистрировано в IIS, чтобы вызывалась aspnet_isapi.dll.

Альтернативный способ определения обработчика HTTP предполагает использование файла .ashx. Такой обработчик активизируется при получении запроса ресурса .ashx. Связь между обработчиком и ресурсом .ashx устанавливается в самом файле ресурса с помощью специальной директивы @WebHandler:

<%@ WebHandler Language="C#" Class="Handler" %>

При получении HTTP-запроса с указанием URL, соответствующего ресурсу .ashx, автоматически вызывается класс Handler. Ниже приведен пример содержимого файла .ashx. Как видите, это просто файл класса, в который добавлена директива @WebHandler.

<%@ WebHandler Language="C#" Class="Handler" %>

using System;

using System.Web;

public class Handler : IHttpHandler

{

public void ProcessRequest(HttpContext context)

{

context.Response.ContentType = "text/plain";

context.Response.Write("Hello World");

}

public bool IsReusable

{

get { return false; }

}

}

Когда для реализации обработчика HTTP используется ресурс .ashx, никакой дополнительной настройки для его инсталляции не требуется.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]