Щоб ще більше спростити слухачі протоколу HTTP, . .NET надає клас HttpListener у просторі імен System.Net. Супроводжуючи цей об'єкт, . .NET надає низку пов'язаних об'єктів, які інкапсулюють роботу обробки HTTP. Зверніть увагу, що цей клас використовує Http.sys компоненти системи для виконання завдання, тому його можна використовувати лише на Windows XPSP2 або Server 2003 або новіших операційних системах.
Клас HttpListener ще більше спрощує операцію прослуховування і повинен лише вказати адресу прослуховування, номер порту та віртуальний шлях через метод рядків, щоб почати роботу прослуховування.
Після початку прослуховування метод GetContext блокує потік, коли надходить запит клієнта, HttpListener повертає об'єкт HttpListenerContext як загальний проксі для обробки запитів клієнта, через властивість Request проксі-об'єкта можна отримати об'єкт типу HttpListenerRequest, що представляє параметри запиту; цей об'єкт об'єктивує більшість параметрів запиту, отже , ми можемо отримати параметри запиту через низку властивостей, які він надає. Наприклад, властивість HttpMethod у HttpListenerRequest надає запитуваний тип методу. Завдяки атрибуту Response проксі ми можемо отримати об'єкт обробки відповіді типу HttpListenerResponse, який інкапсулює дані та операції відповіді, що значно спрощує програмне навантаження відповіді, а робочий процес виглядає так:
//检查系统是否支持 якщо (! HttpListener.IsSupported)
{ throw new System.InvalidOperationException( "Щоб користуватися HttpListener, ви повинні бути на Windows XP SP2 або Server 2003 або новіші!" );
} Зверніть увагу, що префікс має закінчуватися косою чертою / вперед string[] префікси = новий рядок[] { "http://localhost:49152/" }; Створіть слухача. HttpListener listener = новий HttpListener(); Додайте префікс монітора. foreach (рядок s у префіксах)
{ слухач. Префікси.Add(s);
} Починай слухати слухач. Start(); Console.WriteLine("listening..."); хоча (правда)
{ Примітка: метод GetContext блокуватиме потік, доки запит не надійде HttpListenerContext context = слухач. GetContext(); Отримати об'єкт запиту HttpListenerRequest request = контекст. Запит; Console.WriteLine("{0} {1} HTTP/1.1", запит. HttpMethod, запит. RawUrl); Console.WriteLine("Прийняти: {0}", рядок. Приєднатися(",", запитати. AcceptTypes)); Console.WriteLine("Accept-Language: {0}", Нитка. Приєднатися(",", запитати. UserLanguages); Console.WriteLine("User-Agent: {0}", запит. UserAgent); Console.WriteLine("Accept-Encoding: {0}", запит. заголовки["Прийняття-кодування"]); Console.WriteLine("Connection: {0}", Прохання. Залишити Алів е? «Тримати живим»: «близько»); Console.WriteLine("Host: {0}", запит. UserHostName); Console.WriteLine("Pragma: {0}", запит. Заголовки["Pragma"]); Отримайте ціль відповіді Відповідь HttpListenerResponse = контекст. Відповідь; Побудуйте зміст відповіді string responseString = @"<html> <head><title>З HttpListener Server</title></head> <body><h1>Привіт, народ.</h1></body> ";</html> Встановіть вміст, довжину, кодування заголовка відповіді Відповідь. ContentLength64 = System.Text.Encoding.UTF8.GetByteCount(responseString); Відповідь. ContentType = "text/html; charset=UTF-8"; Вихідні відгуки System.IO.Stream output = відповідь. OutputStream; System.IO.StreamWriter = новий System.IO.StreamWriter(output); письменника. Write(відповідРядок); Вихідний потік потрібно вимкнути письменника. Близько(); if (Console.KeyAvailable) перерва;
} Вимкніть сервер слухач. Stop();
При використанні HttpListener часто використовувані параметри запиту та відповіді стають властивостями об'єкта, що значно зменшує навантаження на програмування. Однак більшість параметрів все одно потрібно отримати доступ через індекс заголовків, так само як і до параметра запиту Accept-Encoding у наведеному вище прикладі, до якого ми не можемо отримати доступ безпосередньо через властивості. |