Справочник по C# Герберт Шилдт ббк 32. 973. 26018 75 Ш57 удк 681 07 Издательский дом "Вильямс" Зав редакцией
Скачать 5.05 Mb.
|
Глава 23 Сетевые возможности и использование Internet 646 Часть II. Библиотека C# зык C# ориентирован на использование в современной вычислительной среде, в которой Internet играет немаловажную роль. Поэтому неудивительно, что одним из основных критериев разработки C# -средств являлось обеспечение возможностей использования Internet. Несмотря на то что и такие языки программирования, как С и C++, позволяют подключаться к Internet, загружать файлы и получать желаемые ресурсы, этот процесс нельзя назвать простым и удобным, каким хотели бы его видеть многие программисты. Стандартные средства C# и библиотека .NET Library значительно улучшили эту ситуацию, существенно облегчив программистам создание Internet-приложений. Поддержка сетевых возможностей реализована в двух пространствах имен. В первом, System.Net , определено множество высокоуровневых и удобных для использования классов, в которых предусмотрены различные операции для работы с Internet. Второе пространство имен, System.Net.Sockets , предназначено для поддержки сокетов, которые обеспечивают низкоуровневое управление сетевыми операциями. В этой главе мы используем классы пространства имен System.Net , которые более удобны в применении, и к тому же для большинства приложений их вполне достаточно. На заметку Поддержка серверных ASP.NET-ориентированных приложений реализована в пространстве имен System.Web. Члены пространства имен System.Net System.Net — обширное пространство имен, содержащее множество членов. И хотя здесь будут рассмотрены только некоторые из них, вы должны иметь представление о том, что вообще доступно программисту в этой области. Итак, вот классы, определенные в пространстве имен System.Net : AuthenticationManager Authorization Cookie CookieCollection CookieContainer CookieException CredentialCache Dns DnsPermission DnsPermissionAttribute EndPoint EndpointPermission FileWebRequest FileWebResponse GlobalProxySelection HttpVersion HttpWebRequest HttpWebResponse IPAddress IPEndPoint IPHostEntry NetworkCredential ProtocolViolationException ServicePoint ServicePointManager SocketAddress SocketPermission SocketFermissionAttribute WebClient WebException WebHeaderCollection WebPermission WebPermissionAttribute WebProxy WebRequest WebResponse В пространстве имен System.Net определены также следующие интерфейсы: IAuthenticationModule ICertificatePolicy ICredentials IWebProxy IWebRequestCreate и четыре перечисления: HttpStatusCode NetworkAccess TransportType WebExceptionStatus Я Глава 23. Сетевые возможности и использование Internet 647 Наконец, в пространстве имен System.Net определен один делегат: HttpContinueDelegate Несмотря на то что в пространстве имен System.Net определено так много членов, для решения большинства задач Internet-программирования достаточно ограничиться лишь некоторыми из них. Ядро сетевых программных средств составляют два абстрактных класса WebRequest и WebResponse . Эти классы наследуются классами, которые поддерживают конкретные сетевые протоколы. (Протокол определяет правила, используемые для передачи информации по сети.) Например, производные классы, предназначенные для поддержки стандартного протокола HTTP, имеют имена HttpWebRequest и HttpWebResponse Несмотря на то что классы HttpWebRequest и HttpWebResponse просты в применении, для некоторых задач можно воспользоваться даже еще более простым средством, а именно классом WebClient . Например, если вам нужно лишь загрузить в удаленный компьютер (или из него) некоторый файл, то в большинстве случаев лучше всего для этого использовать именно класс WebClient Универсальные идентификаторы ресурсов В основе Internet-программирования лежит универсальный идентификатор ресурса (Uniform Resource Identifier — URI). URI-идентификатор описывает местоположение в сети некоторого ресурса. URI-идентификатор часто называют также унифицированным указателем информационного ресурса (Uniform Resource Locator — URL). Поскольку при описании членов пространства имен System.Net компания Microsoft использует термин URI, то в данной книге используется именно этот термин. Вероятно, читатель хорошо знаком с URI-идентификаторами, если ему приходилось вводить в Internet-броузер адрес интересующего его сайта. U RI-идентификатор записывается в следующей общей форме: Protocol :// ServerID / FilеРаth ? Query Элемент Protocol означает используемый протокол (например, HTTP). Элемент ServerID идентифицирует конкретный сервер (например, Osborne.com или Weather.com ). Элемент FilePath задает маршрут к нужному файлу. Если элемент FilePath не задан, открывается страница, действующая по умолчанию для указанного значения ServerID . Наконец, элемент Query содержит информацию, которая должна быть послана серверу. Элемент Query необязателен. В языке C# URI-идентификаторы инкапсулированы в классе Uri , который рассматривается позже в этой главе. Основы Internet-доступа Классы, содержащиеся в пространстве имен System.Net , при взаимодействии с Internet поддерживают модель “запрос-ответ”. Это означает, что программа-клиент запрашивает информацию с сервера, а затем ожидает ответ. Например, ваша программа может отправить серверу конкретный URI-идентификатор или адрес Web-сайта. В ответ вы получите гипертекст, связанный с указанным URI-идентификатором. Этот метод запроса- ответа удобен и прост для использования, поскольку большинство деталей обрабатываются автоматически. Иерархии классов, в вершине которых стоят классы WebRequest и WebResponse , реализуют то, что Microsoft называет сменными протоколами (pluggable protocols). Как 648 Часть II. Библиотека C# известно большинству читателей, существуют различные типы протоколов сетевой связи. Наиболее распространенным для Internet-взаимодействия является протокол передачи гипертекстовых файлов (HyperText Transfer Protocol — HTTP). Часто используется и протокол передачи файлов (File Transfer Protocol — FTP). Напомню, что префикс URI- идентификатора задает именно протокол. Например, в таком URI-идентификаторе, как HTTP://MyWebSite.com , используется префикс HTTP , который означает протокол передачи гипертекстовых файлов. Как упоминалось выше, WebRequest и WebResponse — абстрактные классы, в которых определяются операции запроса-ответа, общие для всех протоколов. Из этих абстрактных классов выведены классы, которые реализуют конкретные протоколы. Производные классы регистрируются самостоятельно с помощью статического метода RegisterPrefiх() , который определен в классе WebRequest . При создании объекта класса WebRequest автоматически используется протокол (при условии его доступности), заданный префиксом URI. Достоинство использования настраиваемого адреса состоит в том, что большая часть программы остается неизменной при изменении типа протокола. .NET-среда автоматически определяет протокол HTTP. Следовательно, если вы указываете URI-идентификатор с префиксом HTTP, то автоматически получите HTTP- совместимый класс, поддерживающий этот протокол. К классам, которые поддерживают протокол HTTP, относятся HttpWebRequest и HttpWebResponse . Эти классы — производные от классов WebRequest и WebResponse , и вполне естественно, что в них дополнительно определены собственные члены, которые применимы исключительно к протоколу HTTP. В пространстве имен System.Net предусмотрена поддержка как синхронного, так и асинхронного взаимодействия. Для многих Internet-приложений предпочтительнее использовать синхронные транзакции, поскольку их проще реализовать. При синхронном взаимодействии программа посылает запрос, а затем ожидает ответа. Для некоторых типов высокоэффективных приложений лучше реализовать асинхронное взаимодействие. В этом случае ваша программа, ожидая информацию, может продолжать работу. Однако реализовать асинхронное взаимодействие гораздо труднее. Более того, не всем программам это "на руку". Например, нередки ситуации, когда без ожидаемой из Internet информации программе просто нечего дальше делать. В таких случаях потенциальный выигрыш, ожидаемый от применения асинхронного способа организации связи, не достигается. А поскольку синхронный доступ к Internet и проще реализуем, и более универсален, он и выбран для рассмотрения в этой главе. Итак, начнем с самого главного: классов WebRequest и WebResponse , которые составляют ядро пространства имен System.Net Класс WebRequest Класс WebRequest предназначен для управления сетевыми запросами. Этот класс абстрактный, поскольку не реализует конкретный протокол. Однако в нем определены методы и свойства, общие для всех запросов. Методы класса WebRequest , которые поддерживают синхронную передачу данных, представлены в табл. 23.1, а свойства — в табл. 23.2. Стандартные значения для свойств определяются производными классами. Класс WebRequest не определяет ни одного public -конструктора. Чтобы отправить запрос по URI-адресу, необходимо сначала создать объект класса (выведенного из класса WebRequest ), который реализует желаемый протокол. Это можно сделать с помощью статического метода Create() , определенного в классе WebRequest Метод Create() возвращает объект класса, который является производным от класса WebRequest и реализует нужный протокол. Глава 23. Сетевые возможности и использование Internet 649 Таблица 23.1. Методы поддержки синхронной передачи данных, определенные в классе WebRequest Метод Описание public static WebRequest Create( string uri ); Создает WebRequest -объект для URI-идентификатора, заданного строкой, переданной параметром uri . Возвращаемый объект реализует протокол, заданный префиксом URI-идентификатора. Следовательно, возвращаемый объект будет объектом класса, призванного от WebRequest . Если затребованный протокол недоступен, генерируется исключение типа NotSupportedException . Если же недействителен указанный формат URI-идентификатора, генерируется исключение типа UriFormatException public static WebRequest Create( Uri uri ); Создает WebRequest -объект для URI-идентификатора, заданного строкой, переданной параметром uri . Возвращаемый объект реализует протокол, заданный префиксом URI-идентификатора. Следовательно, возвращаемый объект будет объектом класса, производного от WebRequest . Если затребованный протокол недоступен, генерируется исключение типа NotSupportedException public virtual Stream GetRequestStream() Возвращает выходной поток, связанный с предварительно зарегистрированным URI-идентификатором public virtual WebResponse GetResponse() Отсылает предварительно созданный запрос и ожидает ответ. После получения ответа возвращает его в виде объекта класса WebReponse . Программа должна использовать этот объект для получения информации от заданного URI. При возникновении ошибки в процессе получения ответа генерируется исключение типа WebException Таблица 23.2. Свойства, определенные в классе WebRequest Свойство Описание public virtual string ConnectionGroupName { get; set; } Получает или устанавливает групповое имя подключения. Группы подключения представляют собой способ создания набора запросов, Они не нужны для простых Internet-транзакций public virtual long ContentLength { get; set; } Получает или устанавливает длину пакета переданных данных public virtual string ContentType { get;set;} Получает или устанавливает описание переданной информации public virtual ICredentials Credentials { get; set; } Получает или устанавливает уровень доступа. Уровни доступа необходимы для тех сайтов, которые требуют аутентификации (служба контроля доступа, проверяющая регистрационную информацию пользователя) public virtual WebHeaderCollection Headers{ get; set; } Получает или устанавливает коллекцию заголовков public virtual string Method { get; set; } Получает или устанавливает протокол public virtual bool PreAuthenticate { get; set; } Если равно значению true , в отправляемый запрос включается регистрационная информация. Если равно значению false , регистрационная информация предоставляется только по URI- требованию public virtual IWebProxy Proxy { get; set; } Получает или устанавливает путь к proxy-серверу. Применимо только в средах, в которых используется proxy-сервер public virtual Uri RequestUri { get; } Получает URI запроса public virtual int Timeout { get; set; } Получает или устанавливает количество миллисекунд, в течение которых будет ожидаться ответ на запрос. Для установки бесконечного ожидания используйте значение Timeout.Infinite 650 Часть II. Библиотека C# Класс WebResponse Класс WebResponse инкапсулирует ответ, который принимается в качестве результата запроса. Класс WebResponse — абстрактный. Производные классы создают конкретные версии, ориентированные на поддержку того или иного протокола. Объект класса WebResponse обычно создается посредством вызова метода GetResponse() , определенного в классе WebRequest . Этот объект является экземпляром класса (выведенного из класса WebReponse ), который реализует конкретный протокол. Методы, определенные в классе WebResponse , представлены в табл. 23.3, а свойства — в табл. 23.4. Значения этих свойств устанавливаются на основе каждого ответа. Класс WebResponse не определяет ни одного public -конструктора. Таблица 23.3. Методы, определенные в классе WebResponse Свойство Описание public virtual void Close() Закрывает поток, содержащий ответ. Закрывает также поток ответа, который был возвращен методом GetResponseStream() public virtual Stream GetResponseStream() Возвращает входной поток, связанный с затребованным URI. С помощью этого потока данные могут быть считаны с URI- источника Таблица 23.4. Свойства, определенные в классе WebResponse Свойство Описание public virtual long ContentLength { get; set; } Получает или устанавливает длину пакета принятых данных. Устанавливается равным -1, если данные о длине недоступны public virtual string ContentType { get; set; } Получает описание принимаемой информации public virtual WebHeaderCollection Headers{ get; } Получает коллекцию заголовков, связанных с URI public virtual Uri ReponseUri { get; } Получает URI, который сгенерировал ответ. Этот адрес может отличаться от запрашиваемого, если ответ был перенаправлен на другой URI-адрес Классы HttpWebRequest и HttpWebResponse Классы HttpWebRequest и HttpWebResponse (производные от классов WebRequest и WebResponse , соответственно) реализуют протокол HTTP. В обоих определен ряд собственных свойств, которые позволяют детализировать информацию о HTTP-транзакциях. Использование некоторых из этих свойств демонстрируется позже в этой главе. Однако при выполнении простых Internet-операций вам вряд ли придется прибегать к этим дополнительным средствам. Первый простой пример Организация доступа к Internet сосредоточена в классах WebRequest и WebResponse . Прежде чем подробно проанализировать этот процесс, было бы полезно рассмотреть пример, который иллюстрирует реализацию модели “запрос-ответ” для Internet-доступа. Увидев эти классы в действии, легче понять, почему они организованы именно так. Следующая программа выполняет простую и весьма распространенную Internet- операцию. Она получает гипертекст, содержащийся по заданному URI-адресу. В дан- Глава 23. Сетевые возможности и использование Internet 651 ном случае программа получает содержимое Web-сайта Osborne.com , который принадлежит Осборнскому отделению издательства McGraw-Hill, но вы можете использовать другой Web-сайт. Программа отображает гипертекст на экране порциями по 400 символов, что позволяет прочитать полученную информацию прежде, чем она сойдет с экрана. // Доступ к Internet. using System; using System.Net; using System.IO; class NetDemo { public static void Main() { int ch; // Сначала создаем запрос по URI-адресу. HttpWebRequest req = (HttpWebRequest) WebRequest.Create("http://www.osborne.com"); // Затем отправляем этот запрос и получаем ответ. HttpWebResponse resp = (HttpWebResponse) req.GetResponse(); //Из ответа получаем входной поток. Stream istrm = resp.GetResponseStream(); /* А теперь считываем и отображаем html-документ, полученный от заданного URI. Текст "не улетит" с экрана, поскольку данные отображаются порциями объемом в 400 символов. Просмотрев очередные 400 символов, нажмите клавишу Console.Write((char) ch); if((i%400)==0) { Console.Write("\nНажмите клавишу."); Console.Read(); } } // Закрываем поток, содержащий ответ. При этом // автоматически закроется и входной поток istrm. resp.Close(); } } Ниже приведена первая часть результатов выполнения этой программы. (Конечно же, текст, получаемый с этого Web-сайта, может со временем измениться.) |