Главная страница
Навигация по странице:

  • На заметку Поддержка серверных ASP.NET-ориентированных приложений реализована в пространстве имен System.Web. Члены пространства имен System.Net

  • Универсальные идентификаторы ресурсов

  • Основы Internet-доступа

  • Свойство

  • Классы HttpWebRequest и HttpWebResponse

  • Справочник по C# Герберт Шилдт ббк 32. 973. 26018 75 Ш57 удк 681 07 Издательский дом "Вильямс" Зав редакцией


    Скачать 5.05 Mb.
    НазваниеСправочник по C# Герберт Шилдт ббк 32. 973. 26018 75 Ш57 удк 681 07 Издательский дом "Вильямс" Зав редакцией
    АнкорC #.pdf
    Дата08.12.2017
    Размер5.05 Mb.
    Формат файлаpdf
    Имя файлаC #.pdf
    ТипСправочник
    #10795
    страница44 из 52
    1   ...   40   41   42   43   44   45   46   47   ...   52
    Глава 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 символов, нажмите клавишу для получения следующей порции документа. */ for(int i=1;; i++) { ch = istrm.ReadByte(); if(ch == -1) break;
    Console.Write((char) ch); if((i%400)==0)
    {
    Console.Write("\nНажмите клавишу.");
    Console.Read();
    }
    }
    //
    Закрываем поток, содержащий ответ. При этом
    // автоматически закроется и входной поток istrm. resp.Close();
    }
    }
    Ниже приведена первая часть результатов выполнения этой программы. (Конечно же, текст, получаемый с этого Web-сайта, может со временем измениться.)
    1   ...   40   41   42   43   44   45   46   47   ...   52


    написать администратору сайта