очень просто использовать, но он имеет ограниченные возможности. В частности, нельзя использовать его для предоставления полномочий аутентификации, так как существует не много сайтов, которые будут принимать выгружаемые файлы без аутентификации. Можно добавлять в запросы заголовочную информацию и проверять всю возвращаемую заголовочную информацию, но только в очень общем смысле, потому что нет специальной поддержки для какого-либо протокола. Причина этого состоит в том, что
WebClient
является классом общего назначения, созданным для работы с любым протоколом, для которого можно послать запрос и получить ответ (HTTP, FTP и т. д.). Он не может обрабатывать дополнительные свойства, специфические для какого-то одного протокола, такие как cookies, специфические для HTTP. Если желательно воспользоваться этими свойствами, необходимо выбрать семейство классов на основе двух других классов в пространстве имен
System.Net
:
WebRequest
и
WebResponse
.
Начнем с рассмотрения того, как загрузить страницу Web с помощью этих классов — тот же пример, что и раньше, но использующий
WebRequest
и
WebResponse
. В процессе изложения мы немного коснемся иерархии вовлеченных классов, а затем покажем, как воспользоваться дополнительными свойствами HTTP, поддерживаемыми этой иерархией.
Следующий код доказывает модификации, которые необходимо сделать в примере
Этот код начинается с создания экземпляра объекта, представляющий запрос 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, можно выполнить с помощью класса
Однако 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.