Этот код начинается с создания экземпляра объекта, представляющий запрос 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.
DisplayWebPage
создается как стандартное приложение Windows C#, элемент управления ActiveX
WebBrowser
помещается в форму, как описано выше. По умолчанию Visual Studio.NET именует соответствующую переменную
axWebBrowser1
, и здесь будет оставлено имя по умолчанию. Затем в конструктор
Form1
добавляется код:
public Form1
// Требуется для поддержки Windows Form Designer.
InitializeComponent;
int zero = 0;
object oZero = zero;
string emptyString = "";
object oEmptyString = emptyString;
axWebBrowser1.Navigate("http://www.wrox.com",
ref oZero, ref oEmptyString,
ref oEmptyString, ref oEmptyString);
}
В этом коде используется метод
Navigate
элемента управления
WebBrowser
, который реально посылает запрос HTTP и выводит данные заданного URI. Первый параметр этого метода является строкой, содержащей URL, куда будет совершено перемещение. Остальные параметры соответственно позволяют: задать различные флажки; указать именованную рамку, в которой должен быть выведен браузер; определить любые данные POST, посылаемые с запросом, и дополнительную информацию заголовка HTTP. Используемых по умолчанию нулевых значений и пустых строк будет в данном случае достаточно. Эти параметры задаются в элементе управления как необязательные, но C# не поддерживает необязательные параметры, поэтому нужно определить их явно. Необходимо также явно объявить объектные ссылки для этих переменных, так как они передаются только по ссылке.