Отметим, что в этом примере использованы два потока — StreamReader и соединенный с ним сетевой поток. Это обычно позволяет получать данные из потока как текст и использовать методы более высокого уровня, такие как ReadLine(), которые доступны в классе StreamReader. Это прекрасный пример сделанного в главе 14 замечания о достоинствах перехода от концепции перемещения данных к концепции потока. Выполнение примера создает следующий результат:

Выгрузка файлов

Класс WebClient обладает также методами UploadFile() и UploadData(). Различие между ними состоит в том, что UploadFile() выгружает указанный файл, заданный именем файла, в то время как UploadData() выгружает двоичные данные, которые поставляются как массив байтов:

WebClient client = new WebClient();

client.UploadData('http://www.ourwebsite.com/NewFile.htm', 'C:WebSiteFiles NewFile.htm');

byte [] image;

// код для инициализации изображения, поэтому он содержит все

// двоичные данные для некоторого файла jpg

client.UploadData('http://www.ourwebsite.com/NewFile.jpg', image);

Классы WebRequest

Класс WebClient очень просто использовать, но он имеет ограниченные возможности. В частности, нельзя использовать его для предоставления полномочий аутентификации, так как существует не много сайтов, которые будут принимать выгружаемые файлы без аутентификации. Можно добавлять в запросы заголовочную информацию и проверять всю возвращаемую заголовочную информацию, но только в очень общем смысле, потому что нет специальной поддержки для какого-либо протокола. Причина этого состоит в том, что WebClient является классом общего назначения, созданным для работы с любым протоколом, для которого можно послать запрос и получить ответ (HTTP, FTP и т. д.). Он не может обрабатывать дополнительные свойства, специфические для какого-то одного протокола, такие как cookies, специфические для HTTP. Если желательно воспользоваться этими свойствами, необходимо выбрать семейство классов на основе двух других классов в пространстве имен System.Net: WebRequest и WebResponse.

Начнем с рассмотрения того, как загрузить страницу Web с помощью этих классов — тот же пример, что и раньше, но использующий WebRequest и WebResponse. В процессе изложения мы немного коснемся иерархии вовлеченных классов, а затем покажем, как воспользоваться дополнительными свойствами HTTP, поддерживаемыми этой иерархией.

Следующий код доказывает модификации, которые необходимо сделать в примере BasicWebClient, чтобы он использовал классы WebRequest и WebResponse.

public Form1() {

 InitializeComponent();

 WebRequest wrq = WebRequest.Create('http://www.wrox.com');

 WebResponse wrs = wrq.GetResponse();

 Stream strm = wrs.GetResponseStream();

 StreamReader sr = new StreamReader(strm);

 string line;

 while ((line = sr.ReadLine()) != null) {

  listBox1.Items.Add(line);

 }

 strm.Close();

}

Этот код начинается с создания экземпляра объекта, представляющий запрос Web. Необычно то, что это делается не с помощью использования конструктора, а с помощью вызова статического метода WebRequest.Create(); в следующем разделе будет показано, почему так это сделано. Класс WebRequest представляет запрос информации, который посылается по определенному URI, и поэтому необходимо передать URI с помощью метода Create(). WebResponse представляет данные, присылаемые назад сервером. Вызов метода WebRequest.GetResponse() в действительности посылает запрос серверу Web и создает объект Response, который можно использовать для проверки возвращаемых данных. Как и для объекта WebClient, можно получить поток, представляющий эти данные с помощью метода WebResponse.GetResponseStream().

Другие свойства WebRequest и WebResponse

Здесь кратко будут упомянуты пара других областей, в которых WebRequest и WebResponse и связанные классы предоставляют хорошую поддержку.

Информация заголовка HTTP

Важной частью протокола HTTP является возможность послать значительную заголовочную информацию с помощью потоков запроса и ответа. Эта информация может включать данные GET и POST, cookies, а также данные определенного пользователя, посылающего запрос. Как и можно было ожидать, предоставляется полная поддержка заданию и доступу к этим данным. Однако эта поддержка не является частью классов WebRequest и WebResponse, она реализована двумя производными классами: HttpWebRequest и HttpWebResponse. Как скоро будет показано, при создании объекта WebRequest с помощью обычного механизма, если предоставленный URI был URI HTTP, то получаемая ссылка в действительности указывает на объект HttpRequest, и можно при желании преобразовать эту ссылку в такой объект. Реализация HttpRequest метода GetResponse() возвращает объект HttpWebResponse через ссылку WebResponse, поэтому снова можно выполнить простое преобразование для доступа к свойствам, специфическим для HTTP.

Подробное описание этой области представлено в документации MSDN для классов HttpWebRequest и HttpWebResponse.

Асинхронные запросы страниц

Дополнительным полезным свойством WebRequest вместо WebClient является возможность асинхронного запроса страниц. Это важно, так как в Интернете возможна достаточно длительная задержка между отправкой запроса на хост и началом получения каких-либо данных. Методы, подобные WebClient.DownloadData и WebRequest.GetResponse, не

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату