Спочатку розглянемо клас WebRequest:
Методи і властивості класу WebRequest
Методи і властивості
Create () і CreateDefault ()
У класі WebRequest немає відкритого конструктора. Замість конструктора для створення екземплярів класу можуть використовуватися статичні методи Create () і CreateDefault (). Ці методи в дійсності створюють не об'єкт типу WebRequest, а новий об'єкт класу, похідного від WebRequest, такого як HttpWebRequest або FileWebRequest.
Використовуючи метод RegisterPrefix (), можна зареєструвати клас для обробки специфічного протоколу. Об'єкти цього класу будуть створюватися методом WebRequest.Create (). Цей механізм називається "підключаються протоколами" (pluggable protocols).
Метод GetRequestStream () повертає об'єкт потоку, який може використовуватися для відправлення деяких даних на сервер.
BeginGetRequestStream () і EndGetRequestStream ()
Асинхронний доступ до потоку запиту виконується методами BeginGetRequestStream () і EndGetRequestStream ().
Метод GetResponse () повертає об'єкт WebResponse, який може використовуватися для читання даних, отриманих від сервера.
BeginGetResponse () і EndGetResponse ()
Як і для потоку запиту, є асинхронні методи дпя отримання потоку відповіді.
Якщо метод BeginXX () почав асинхронну обробку, її можна зупинити методом Abort ().
RequestUri - властивість тільки для читання, яке повертає URI, пов'язаний з WebRequest. Цей URI може бути встановлений в статичному методі Create () даного класу.
Властивість Method використовується, щоб отримати або встановити метод для конкретного запиту. Об'єкт HttpWebRequest підтримує HTTP-методи GET, POST, HEAD і т. Д.
Залежно від використовуваного протоколу сервера може передаватися і від сервера може виходити різна інформація в заголовках. Інформація заголовка протоколу міститься в колекції WebHeaderCollection, до якої можна звертатися через властивість Headers.
ContentType і ContentLength
Тип даних, відправлених сервера, визначається у властивості ContentType. Можуть бути різні типи даних такої довжини, щоб дані могли розміститися в масиві байтів. Тип вмісту зазвичай визначає МIМЕ-тип даних: image / jpeg, image / gif, text / html або text / xml.
Якщо серверу потрібна аутентифікація користувача, посвідчення особи користувача можна встановити через властивість Credentials.
Для протоколів, що підтримують попередню аутентифікацію, у властивості PreAuthenticate можна встановити значення true. За замовчуванням Web-браузер спочатку намагається звернутися до сторінці Web-сайту без аутентифікації. Якщо Web-сайту потрібно аутентифікація, сервер відповідає, що для неідентифікованих користувачів доступ відхилений. Наступний запит, що виконується клієнтом, містить інформацію аутентифікації. Цього додаткового циклу обміну можна уникнути, якщо встановити в властивості PreAuthenticate значення true.
У властивості Proxy можна встановити Web-проксі, який використовується для цього запиту.
У властивості ConnectionGroupName можна визначити пул з'єднань, який повинен використовуватися з цим об'єктом WebRequest.
Властивість Timeout визначає час в мілісекундах, яке необхідно для відповіді від сервера. За умовчанням встановлено значення 100 000 МЛС. Якщо протягом цього часу сервер не відповідає, породжується виняток WebException.
Клас WebResponse використовується для читання даних від сервера. Об'єкт цього класу повертається методом GetResponse (), як видно при розгляді класу WebRequest.
Методи і властивості класу WebResponse
Методи і властивості
Метод GetResponseStream () повертає об'єкт потоку, який використовується для читання відповіді від сервера.
Якщо об'єкт відповіді більше не потрібен, його слід закрити методом Close ().
Властивість Headers повертає колекцію WebHeaderCollection, яка включає специфічну для протоколу інформацію про заголовках, що повертаються від сервера.
Давайте розглянемо невеликий приклад використання цих класів в WPF-додатку:
підключаються протоколи
WebRequest - це абстрактний клас, тому метод WebRequest.Create () не може створити об'єкт типу WebRequest - замість цього створюється об'єкт класу, похідного від WebRequest. При передачі HTTP-запиту методу WebRequest.Create () створюється об'єкт HttpWebRequest. При передачі запиту до схеми файлу створюється об'єкт FileWebRequest.
Як показано далі, схеми http, https і file зумовлені в конфігураційному файлі .NET, файлі machine.config. Конфігураційний файл можна знайти в каталозі
Набір протоколів, використовуваних класом WebRequest, можна розширити програмно або додавши елемент в конфігураційний файл. Для підтримки нового протоколу, відмінного від схем http, https і file, потрібно створити новий клас, похідний від WebRequest, наприклад FtpWebRequest для протоколу FTP. Цей клас повинен перевизначити методи і властивості базового класу і в них реалізувати специфічне для протоколу поведінку. Крім того, потрібно визначити клас-ініціатор (factory class). створює об'єкти класу FtpWebRequest. Такий клас-ініціатор, який використовується класом WebRequest, повинен реалізувати інтерфейс IWebRequestCreate. Назвемо цей клас FtpWebRequestCreator. Примірник цього класу повинен бути зареєстрований для схеми ftp за допомогою класу WebRequest:
Якщо тепер схема ftp використовується з методом WebRequest.Create (), створюється і повертається в програму новий екземпляр класу FtpWebRequest. Тепер об'єкт request можна використовувати для копіювання файлів з FTP-cepвера і на FTP-сервер. Тут ми не збираємося займатися реалізацією класу FtpWebRequestCreator, але ви можете це зробити самостійно. Для програмування FTP-клієнта потрібно використовувати класи сокетів з з'єднанням TCP.
FileWebRequest і FileWebResponse
Читання і запис локальних файлів або файлів, що знаходяться на спільно використовуваних пристроях, що не дуже відрізняються від читання і запису файлів, розташованих на Web-серверах. Щоб зчитувати і записувати файли, використовуємо класи FileWebRequest і FileWebResponse. Однак багато методи і властивості, певні в базових класах WebRequest і WebResponse, не використовуються в похідних класах, і в документації MSDN вони лише перераховуються, як "зарезервовані для використання в майбутньому".
Для демонстрації можливого використання класів FileWebRequest і FileWebResponse створюється просте додаток WPF, в якому ім'я файлу можна ввести в текстовому полі, після чого файл відкривається і відображається в багаторядковому текстовому полі. У відкритий файл можна буде записати новий текст:
Читання з файлів
Запис в файли
Для запису даних назад в файл реалізуємо обробник клацання по кнопці "Зберегти". Як і раніше, створимо об'єкт WebRequest, передаючи ім'я файлу. Тепер замість StreamReader використовуємо StreamWriter. Крім цього є ще одна істотна зміна в коді. Щоб зробити потік "записуваним", слід встановити в властивості Method значення "PUT". За замовчуванням ця властивість має значення "GET", вказуючи, що потік можна тільки зчитувати:
Асинхронні запити сторінок
Додатковим засобом класу WebRequest є здатність запитувати сторінки асинхронно. Це засіб суттєво, тому що між відправленням запиту на хост і отриманням відповіді може існувати відчутна затримка. Такі методи, як WebClient.DownloadData () і WebRequest.GetResponse (), не повернуть управління, поки не буде готовий відповідь сервера. Навряд чи захочеться "заморожувати" додаток на тривалий період, і тому в таких сценаріях краще застосовувати методи BeginGetResponse () і EndGetResponse ().
Метод BeginGetResponse () працює асинхронно і повертає управління практично миттєво. "За лаштунками" виконуючого середовища асинхронно управляє фоновим потоком, щоб отримати відповідь від сервера. Замість повернення об'єкта WebResponse, метод BeginGetResponse () повертає об'єкт, який реалізує інтерфейс IAsyncResult. З цим інтерфейсом можете продовжити роботу або почекати, поки не стане доступним відповідь, і потім викликати EndGetResponse () для збору результатів.
Можна також передати делегат зворотного виклику в метод BeginGetResponse (). Метою делегата зворотного виклику повинен бути метод, який повертає void і приймає посилання IAsyncResult як параметр. Коли робочий потік завершує отримання результату, виконуюча середовище викликає делегат зворотного виклику, щоб проінформувати про завершення роботи. Як показано в наступному коді, виклик EndGetResponse () в методі зворотного виклику дозволяє витягти об'єкт WebResponse (модифікуємо перший приклад):
Зверніть увагу, що для отримання вихідного об'єкта WebRequest методу BeginGetResponse () можна передати цей об'єкт у другому параметрі. Другий параметр є посиланням на об'єкт, і він відомий як параметр стану. Під час виконання методу зворотного виклику той же об'єкт стану можна витягти з використанням властивості AsyncState інтерфейсу IAsyncResult.