может быть эффективно, такие приложения очень быстро начинают походить друг на друга. Добавляя некоторый код GDI+, чтобы выполнить специальное рисование, можно выделить свое приложение и сделать его внешне более оригинальным.
Глава 22
В главах 16–18 было показано, как использовать C# для создания мощных и эффективных динамических страниц Web с помощью ASP.NET, а также служб Web. Клиенты, обращающиеся к страницам ASP.NET, по большей части будут пользователями Internet Explorer или какого-либо другого браузера Web. Но иногда необходимо, чтобы создаваемые приложения действовали как клиенты Web. Это может быть, например, если нужно добавить в создаваемые приложения свойства просмотра Web, или, если необходимо, чтобы создаваемые приложения программным путем получали информацию с некоторых web-сайтов. В последнем случае обычно лучше, чтобы сайт реализовал службу Web, но при обращении к внешним сайтам возможно отсутствие контроля за тем, как реализован сайт, и поэтому может не быть другой возможности выбора, кроме программного доступа к сайту, который реализован как стандартные страницы HTML, ASP или ASP.NET.
Именно эту сторону картины мы кратко рассмотрим сейчас. В частности, будут представлены средства базовых классов .NET для использования различных сетевых протоколов, например HTTP для доступа к сетям и Интернету в качестве клиента. Мы обсудим следующие вопросы:
□ Запрос данных из Web и получение ответа от серверов
□ Отправку данных HTTP POST
□ Извлечение информации заголовка HTTP из ответов серверов
Коротко коснемся средств, существующих для прямого доступа к службам нижнего уровня, таким как отправка и получение пакетов TCP и ожидание приема на определенных портах.
Пространства имен System.Net
и System.Net.Sockets
содержат большинство базовых классов .NET, которые связаны с работой в сети с точки зрения клиента. Пространство имен System.Net
обычно связано с операциями более высокого уровня, например загрузкой и выгрузкой файлов и выполнением запросов Web с помощью HTTP и других протоколов, в то время как System.Net.Sockets
содержит классы, связанные с операциями более низкого уровня. Они более полезны при работе непосредственно с сокетами или такими протоколами, как TCP/IP, и используются по большей части для сокрытия соответствующей функции API Windows.
В этой главе используется достаточно практичный подход: представлен ряд постепенно усложняющихся примеров в сопровождении соответствующей теории и с обсуждением сетевых концепций.
Мы начнем с простейшего случая, когда необходимо просто послать серверу запрос и сохранить или обработать полученную информацию.
Класс WebClient
Если необходимо выполнить запрос файла по определенному URL, то, скорее всего, самым простым классом .NET для использования в этом случае окажется System.Net.WebClient
. Это класс максимально высокого уровня, созданный для выполнения базовых операций с помощью одной или двух команд.
Загрузка файлов
Существует два способа загрузки файлов с web-сайта с помощью WebClient
, в зависимости от того, хотим ли мы файл сохранить или обработать его содержимое файла непосредственно внутри приложения. Если нужно просто сохранить файл, то вызывается метод DownloadFile()
. Этот метод получает два параметра: URL, из которого необходимо извлечь файл, и имя файла (или путь доступа), в котором мы хотим сохранить файл.
WebClient Client = new WebClient();
Client.DownloadFile('http://www.Wrox.com/default.htm', 'index.htm');
Более часто приложению приходится обрабатывать данные, полученные с web-сайта. Чтобы сделать это, используется метод OpenRead()
, который возвращает ссылку типа Stream
. Затем можно извлекать данные просто из потока.
WebClient Client = new WebClient();
Stream sfrm = Client.OpenRead('http://www.Wrox.com/default.htm');
Пример: базовый клиент Web
Первый пример продемонстрирует использование метода webClient.OpenRead()
. В этом случае содержимое загруженных данных просто выводится в окне списка. Проект создается как стандартное приложение C# для Windows, в него добавляется окно списка с именем listBox1
, в котором выводится содержимое загруженного файла. Затем в конструкторе основной формы делаются изменения:
public Form1() {
InitializeComponent();
System.Net.WebClient Client = new WebClient();
Stream strm = Client.OpenRead('http://www.wrox.com');
StreamReader sr = new StreamReader(strm);
string line;
do {
line = sr.ReadLine();
listBox1.Items.Add(line);
}
while (line != null) strm.Close();
}
Для упрощения URI в программе жестко закодирован.
Акроним URI (Uniform Resource Identifier) — Универсальный идентификатор ресурса — означает любую короткую строку, указывающую на некоторый ресурс. Следовательно, строка вида http://www.wrox.com является URI. В прошлом для идентификации таких адресов традиционно использовался термин URL (универсальный локатор ресурса), но термин URL больше не используется в новых технических спецификациях, теперь предпочтение отдается URI. URI имеет приблизительно такое же значение, как и URL, но более распространен, так как URI не обязательно предполагает, что используется один из известных протоколов, таких как HTTP или FTP.