Чтение онлайн

ЖАНРЫ

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

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

Класс

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
, не возвращают управление, пока с сервера не вернется ответ. Может оказаться нежелательным, чтобы приложение было связано с ожиданием в течение этого времени. В таком случае попробуйте воспользоваться методами
BeginGetResponse
и
EndGetResponse
. Они работают асинхронно. Если вызвать
BeginGetResponse
, то запрос будет отправлен на хост, а метод немедленно вернет управление, предоставляя делегата типа
AsyncCallback
. Пока сервер отвечает на запрос, можно будет выполнять другую работу. Подробное описание этих методов можно найти в MSDN.

Отображение выходных данных в виде страницы HTML

Первый пример показывает, что базовые классы .NET существенно облегчают загрузку и обработку данных из Интернета. Однако до сих пор файлы выводились только как простой текст. В приложении желательно часто просматривать файл HTML с помощью интерфейса в стиле Internet Explorer, чтобы установить, как действительно выглядит документ Web. К сожалению, когда писалась эта книга, базовые классы .NET не включали никакой собственной поддержки для управления этими свойствами интерфейса в стиле Internet Explorer. Чтобы сделать это, необходимо либо программным путем вызвать Internet Explorer, либо воспользоваться элементом управления ActiveX

WebBrowser
, который существовал уже до появления .NET.

Одним из случаев, где интерфейс пользователя выводится в стиле Internet Explorer, является создание приложения C#, которое генерирует или допускает редактирование страниц HTML с последующим выводом сгенерированных страниц пользователю.

Программный запуск процесса Internet Explorer, направленного на заданную страницу Web, можно выполнить с помощью класса

Process
из пространства имен
System.Diagnostics
.

Process myProcess = new Process;

myProcess.StartInfо.FileName = "iexplore.exe";

myProcess.StartInfo.Arguments = "http://www.wrox.com";

myProcess.Start;

Однако IE при этом запускается и как отдельное окно, которое на самом деле не соединено и не находится под управлением приложения. Следовательно, хотя этот код приведен здесь для справки, такая техника не подходит для частого применения.

С другой стороны использование элемента управления WebBrowser означает, что выведенный браузер может составить интегральную часть приложения, и приложение получит полный контроль над работой браузера. Этот элемент управления достаточно развит, обладает большим числом методов свойств и событий.

Простейшим способом встроить этот элемент управления с помощью Visual Studio.NET является добавление элемента управления в панель инструментов. Для этого щелкните правой кнопкой мыши на Toolbox в VisualStudio.NET и выберите Customize Toolbox из контекстного меню, что вызывает диалоговое окно, приведенное ниже. Необходимо выбрать вкладку COM Component и щелкнуть на Microsoft Web Browser.

Элемент управления WebBrowser появится теперь в панели инструментов, можно щелкнуть та нем, чтобы поместить его на форму в приложении Windows на C#, так же, как любой другой элемент управления Windows Forms в .NET. Visual Studio.NET автоматически создает весь код взаимодействия COM, необходимый программе C# для работы в качестве клиента с этим элементом управления, чтобы можно было интерпретировать его как просто элемент управления .NET. Это будет продемонстрировано с помощью другого очень короткого примера

DisplayWebPage
, в котором выводится страница Web с жестко закодированным URI.

Поделиться с друзьями: