HTTP Хендлери в ASP .NET

Доброго вечора! Вивчаючи ASP .NET, я дізнався про кілька класних можливостей, які можуть вам стати у нагоді! Одна з них – власні HTTP хендлери , які дозволяють кастомізувати відповідь сервера, яку отримує браузер.

Скажу відразу, що робота з хендлерами не є дуже простою через те, що вам потрібно погрузитись на нижчий рівень веб-серверу.

Під хендлером можна уявляти якийсь об’єкт, який приймає певний запит, аналізує його та відправляє відповідь.

Тепер, коли ви маєте більшу уяву про хендлер, можна приступити до його реалізації.

Реалізація хендлера

Будь-який HTTP хендлер, який ви хочете створити, має реалізувати інтерфейс IHttpHandler, який в свою чергу має одну властивість : IsReusable – ідентифікатор повторного використання об’єкту та метод ProcessRequest, в якому можна обробити запит та відправити відповідь.

Створіть новий проект та добавте клас з назвою AccessDeniedHandler, після чого унаслідуйте його від інтерфейсу IHttpHandler. Добавте властивість і метод, про який я згадував вище:

public class AccessDeniedHandler : IHttpHandler
{
    public bool IsReusable
    {
        get { return true; }
    }
    public void ProcessRequest(HttpContext context)
    {
        throw new NotImplementedException();
    }
}

Як ви бачите, в метод ProcessRequest передається контекст HTTP запиту, через який ми можемо доступитись до об’єкту HttpRequest та HttpResponse для аналізу запиту та формування відповіді.
Тому добавте саму просту реалізацію, яка відішле повідомлення про заборону доступу:

public void ProcessRequest(HttpContext context)
{
     context.Response.Write("<h1>Access Denied</h1>");
}

Звичайно цей хендлер не буде формувати таку відповідь для всіх типів запитів, тому потрібно в конфігураційному файлі добавити певний елемент, який ідентифікує хендлер та всі типи запитів, які йому будуть передаватись на обробку. Для цього в секції <system.web> добавте вкладену секцію <httpHandlers>:

<httpHandlers>
     <add type="HttpHandlerSample.AccessDeniedHandler" path="*.config" verb="*"/>
</httpHandlers>

Кожен окремий хендлер ідентифікується елементом <add>, який має атрибути type – простір імен та назва класу обробника, path – шлях, запит до якого буде направлений до обробника, verb – тип HTTP запиту (GET або POST). В цьому прикладі я вказав на те, що всі запити (GET та POST), які звертаються до файлу з розширенням .config будуть передані до обробника AcessDeniedHandler.

Якщо ми запустимо сторінку із запитом на файл test.config, отримаємо такий результат:

Мал. 1.1

Тепер поміняйте код, для відправки відповіді з картинкою:

public void ProcessRequest(HttpContext context)
{
     String filePath = context.Server.MapPath(@"\Images\accessDenied.jpg");
     context.Response.ContentType = "image/jpg";
     context.Response.WriteFile(filePath);
}

Ось тут я вказав шлях на картинку, яка знаходиться в папці із сервером. Обновивши сторінку, ви отримаєте таку відповідь:

Мал. 1.2

В цьому прикладі можна створити окрему сторінку та перенаправляти користувача до неї, за допомогою методу Transfer класу HttpServerUtility:

public void ProcessRequest(HttpContext context)
{
     context.Server.Transfer("AccessDenied.aspx");
}

В результаті користувачу буде відображена сторінка з помилкою:

Мал. 1.3

В стрічці запиту також можна передавати якісь параметри, після чого в обробці запиту аналізувати їх, і відправляти відповідь. Ось невеликий приклад того, як можна передати параметри в стрічці запиту:

http://localhost:4931/web.config?login=admin&password=test

В коді ці значення можна отримати через екземпляр класу HttpRequest, до якого можна доступитись через властивість Request, яка знаходиться в контексті HTTP запиту переданого для обробки:

public void ProcessRequest(HttpContext context)
{
     String login = context.Request.QueryString["login"];
     String password = context.Request.QueryString["password"];
     if(CheckPermission(login, password))
          context.Response.WriteFile("web.config");
     else
          context.Server.Transfer("AccessDenied.aspx");
}
private Boolean CheckPermission(String login, String password)
{
       if (login == "admin" && password == "test")
           return true;
       else
           return false;
}

Тут я жорстко зашив логін і пароль для прикладу, хоча в більш реальнішій ситуації він мав би зберігатись в базі даних та передаватись не в стрічці запиту, а в тілі POST HTTP запиту.

Якщо передати такий запит до сторінки: http://localhost:4931/web.config?login=admin&password=test

(з правильним логіном і паролем), то отримаємо вміст конфігураційного файлу серверу:

Мал. 1.4

Отже, використовуючи засоби ASP .NET, ви маєте можливість зробити свого власного обробника запитів, починаючи від самих простих: відправка відповіді у вигляді HTML та до більш складніших: аналіз вхідних параметрів та формування відповідної відповіді.

На наступний раз я запишу веб каст про роботу з картографічними сервісами Bing, після чого викладу його сюди та на сайт http://techdays.in.ua/ :). Всього найкращого!

Скачати приклад програми

Advertisements

, , ,

  1. #1 by persona13 on July 25, 2019 - 12:22

    дякую за гайд

  1. HTTP Модулі в ASP .NET « Blog by Serhiy Shumakov
  2. Створення динамічних зображень в ASP .NET за допомогою GDI+. « Blog by Serhiy Shumakov

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: