программирование. Руководство su P# a n Reference в herbert schildt полное руководство с 0 герберт шилдт
Скачать 3.32 Mb.
|
public string CharacterSet { get; } Получает название используемого набора символов public { get; string ContentEncoding } Получает название схемы кодирования public long ContentLength { get; } Получает длину принимаемого содержимого. Если она недоступна, свойство имеет значение ‑1 public string ContentType { get; } Получает описание содержимого public CookieCollection Cookies Получает или устанавливает список cookie‑ { get; set; } наборов, присоединяемых к ответу public WebHeaderCollection Получает коллекцию заголовков, присоединяе Headers! get; } мых к ответу public bool IsFromCache { get; } Принимает логическое значение true, если запрос получен из кеша. А если запрос доставлен по сети, то принимает логическое значение false public bool Принимает логическое значение true, если IsMutuallyAuthenticated { get; } клиент и сервер опознают друг друга, а иначе – принимает логическое значение false public DateTime LastModified { get; } Получает время последней модификации ресурса public string Method { get; } Получает строку, которая задает способ ответа public Version ProtocolVersion Получает объект типа Version, описываю { get; } щий версию протокола HTTP, используемую в транзакции public Uri ReponseUri { get; } Получает URI, по которому был сформирован ответ. Этот идентификатор может отличаться от запрашиваемого, если ответ был переадресован по другому URI public string Server { get; } Получает строку, обозначающую имя сервера public HttpStatusCode StatusCode Получает объект типа HttpStatusCode, опи { get; } сывающий состояние транзакции public string StatusDescription Получает строку, обозначающую состояние { get; } транзакции в удобочитаемой форме Доступ к заголовку Для доступа к заголовку с информацией, получаемой в ответ по протоколу HTTP, служит свойство Headers, определенное в классе HttpWebResponse. public WebHeaderCollection Headers{ get; } Заголовок протокола HTTP состоит из пар "имя‑значение", представленных строками. Каждая пара "имя‑значение" хранится в коллекции класса WebHeaderCollection. Эта коллекция специально предназначена для хранения пар "имя‑значение" и применяется аналогично любой другой коллекции (подробнее об этом см. в главе 25). Строковый массив имен может быть получен из свойства AllKeys, а отдельные значения – по соответствующему имени при вызове метода Get Values () . Этот метод возвращает массив строк, содержащий значения, связанные с заголовком, передаваемым в качестве аргумента. Метод Get Values () перегружается, чтобы принять числовой индекс или имя заголовка. В приведенной ниже программе отображаются заголовки, связанные с сетевым ресурсом, доступным по адресу www. McGraw‑Hill . com. // Проверить заголовки. using System; using System.Net; class HeaderDemo { static void Main() { // Создать объект запроса типа WebRequest по указанному URI. HttpWebRequest req = (HttpWebRequest) WebRequest.Create(" http://www.McGraw‑Hill.com "); // Отправить сформированный запрос и получить на него ответ. HttpWebResponse resp = (HttpWebResponse) req.GetResponse (); // Получить список имен. string[] names = resp.Headers.AllKeys; // Отобразить пары "имя‑значение" из заголовка. Console.WriteLine ("{0,‑20}{1}\п", "Имя", "Значение"); foreach(string n in names) { Console.Write ("{0,‑20}", n); foreach(string v in resp.Headers.GetValues(n)) Console.WriteLine(v); } // Закрыть ответный поток, resp.Close(); } } Ниже приведен полученный результат. Не следует забывать, что информация в заголовке периодически меняется, поэтому у вас результат может оказаться несколько иным. Имя Значение Transfer‑encoding chunked Content‑Type text/html Date Sun, 06 Dec 2009 20:32:06 GMT Server Sun‑ONE‑Web‑Server/6.1 Доступ к cookie‑наборам Для доступа к cookie‑наборам, получаемым в ответ по протоколу HTTP, служит свойство Cookies, определенное в классе HttpWebResponse. В cookie‑Ha6opax содержится информация, сохраняемая браузером. Они состоят из пар "имя‑значение" и упрощают некоторые виды доступа к веб‑сайтам. Ниже показано, каким образом определяется свойство Cookies. public CookieCollection Cookies { get; set; } В классе CookieCollection реализуются интерфейсы ICollection и IEnumerable, и поэтому его можно использовать аналогично классу любой другой коллекции (подробнее об этом см. в главе 25). У этого класса имеется также индексатор, позволяющий получать cookie‑Ha 6op по указанному индексу или имени. В коллекции типа CookieCollection хранятся объекты класса Cookie. В классе Cookie определяется несколько свойств, предоставляющих доступ к различным фрагментам информации, связанной с cookie‑набором. Ниже приведены два свойства, Name и Value, используемые в примерах программ из этой главы. public string Name { get; set; } public string Value { get; set; } Имя cookie‑Ha 6opa содержится в свойстве Name, а его значение – в свойстве Value. Для того чтобы получить список cookie‑наборов из принятого ответа, необходимо предоставить соок1е‑контейнер с запросом. И для этой цели в классе HttpWebRequest определяется свойство CookieContainer, приведенное ниже. public CookieContainer CookieContainer { get; set; } В классе CookieContainer предоставляются различные поля, свойства и методы, позволяющие хранить сооЫе‑наборы. По умолчанию свойство CookieContainer содержит пустое значение. Для того чтобы воспользоваться cookie‑наборами, необходимо установить это свойство равным экземпляру класса CookieContainer. Во многих приложениях свойство CookieContainer не применяется непосредственно, а вместо него из принятого ответа составляется и затем используется коллекция типа CookieCollection. Свойство CookieContainer просто обеспечивает внутренний механизм сохранения cookie‑наборов. В приведенном ниже примере программы отображаются имена и значения cookie‑наборов, получаемых из источника по URI, указываемому в командной строке. Следует, однако, иметь в виду, что cookie‑наборы используются не на всех веб‑сайтах, поэтому нужно еще найти такой веб‑сайт, который поддерживает cookie‑наборы. /* Пример проверки cookie‑наборов. Для того чтобы проверить, какие именно cookie‑наборы используются на веб‑сайте, укажите его имя в командной строке. Так, если назвать эту программу CookieDemo, то по команде CookieDemo http://msn.com отобразятся cookie‑наборы с веб‑сайта по адресу www.msn.com . */ using System; using System.Net; class CookieDemo { static void Main(string[] args) { Console.WriteLine("Применение: CookieDemo } 11 Создать объект запроса типа WebRequest по указанному URI. HttpWebRequest req = (HttpWebRequest) WebRequest.Create(args[0]); // Получить пустой контейнер. req.CookieContainer = new CookieContainer(); // Отправить сформированный запрос и получить на него ответ. HttpWebResponse resp = (HttpWebResponse) req.GetResponse (); // Отобразить cookie‑наборы. Console.WriteLine("Количество cookie‑наборов: " + resp.Cookies.Count); Console.WriteLine("{0,‑20}{1}", "Имя", "Значение"); for(int i=0; i < resp.Cookies.Count; i++) Console.WriteLine("{0, ‑20}{1}", resp.Cookies[i].Name, resp.Cookies[i].Value); // Закрыть ответный поток, resp.Close (); } } Применение свойства LastModified #Иногда требуется знать, когда именно сетевой ресурс был обновлен в последний раз. Это нетрудно сделать, пользуясь сетевыми средствами класса HttpWebResponse, среди которых определено свойство LastModified, приведенное ниже. public DateTime LastModified { get; } С помощью свойства LastModified получается время обновления содержимого сетевого ресурса в последний раз. В приведенном ниже примере программы отображаются дата и время, когда был в последний раз обновлен ресурс, указываемый по URI в командной строке. /* Использовать свойство LastModified. Для того чтобы проверить дату последнего обновления веб‑сайта, введите его URI в командной строке. Так, если назвать эту программу LastModifiedDemo, то для проверки даты последней модификации веб‑сайта по адресу www.HerbSchildt.com введите команду LastModif iedDemo http: //HerbSchildt. com */ using System; using System.Net; static void Main(string[] args) { if(args.Length != 1) { Console.WriteLine("Применение: LastModifiedDemo } HttpWebRequest req = (HttpWebRequest) WebRequest.Create(args[0]) ; HttpWebResponse resp = (HttpWebResponse) req.GetResponse(); Console.WriteLine("Последняя модификация: " + resp.LastModified); resp.Close (); } } Практический пример создания программы MiniCrawler Для того чтобы показать, насколько просто программировать для Интернета средствами классов WebRequest и WebReponse, обратимся к разработке скелетного варианта поискового робота под названием MiniCrawler. Поисковый робот представляет собой программу последовательного перехода от одной ссылки на сетевой ресурс к другой. Поисковые роботы применяются в поисковых механизмах для каталогизации содержимого. Разумеется, поисковый робот MiniCrawler не обладает такими развитыми возможностями, как те, что применяются в поисковых механизмах. Эта программа начинается с ввода пользователем конкретного адреса URI, по которому затем читается содержимое и осуществляется поиск в нем ссылки. Если ссылка найдена, то программа запрашивает пользователя, желает ли он перейти по этой ссылке к обнаруженному сетевому ресурсу, найти другую ссылку на имеющейся странице или выйти из программы. Несмотря на всю простоту такого алгоритма поиска сетевых ресурсов, он служит интересным и наглядным примером доступа к Интернету средствами С#. Программе MiniCrawler присущ ряд ограничений. Во‑первых, в ней обнаруживаются только абсолютные ссылки, указываемые по гипертекстовой команде href="http. Относительные ссылки при этом не обнаруживаются. Во‑вторых, возврат к предыдущей ссылке в программе не предусматривается. И в‑третьих, в ней отображаются только ссылки, но не окружающее их содержимое. Несмотря на все указанные ограничения данного скелетного варианта поискового робота, он вполне работоспособен и может быть без особых хлопот усовершенствован для решения других задач. На самом деле добавление новых возможностей в программу MiniCrawler – это удобный случай освоить на практике сетевые классы и узнать больше о сетевом подключении к Интернету. Ниже приведен полностью исходный код программы MiniCrawler. /* MiniCrawler: скелетный вариант поискового робота. Применение: для запуска поискового робота укажите URI в командной строке. Например, для того чтобы начать поиск с адреса www.McGraw‑Hill.com , введите следующую команду: MiniCrawler http://McGraw‑Hill.com */ using System; using System.Net; using System.10; class MiniCrawler { // Найти ссылку в строке содержимого, static string FindLink(string htmlstr, ref int startloc) { int i; int start, end; string uri = null; i = htmlstr.IndexOf("href=\"http", startloc, StringComparison.OrdinallgnoreCase); if(i != ‑1) { start = htmlstr. IndexOf (1111, i) + 1; end = htmlstr. IndexOf (1111, start); uri = htmlstr.Substring(start, end‑start); startloc = end; } return uri; } static void Main(string[] args) { string link = null; string str; string answer; int curloc; // содержит текущее положение в ответе if(args.Length != 1) { Console.WriteLine ("Применение: MiniCrawler } string uristr = args[0]; // содержит текущий URI HttpWebResponse resp = null; try { do { Console .WriteLine ("Переход по ссылке 11 + uristr); // Создать объект запроса типа WebRequest по указанному URI. HttpWebRequest req = (HttpWebRequest) WebRequest.Create(uristr); uristr = null; // запретить дальнейшее использование этого URI // Отправить сформированный запрос и получить на него ответ, resp = (HttpWebResponse) req.GetResponse(); Stream istrm = resp.GetResponseStream () ; // Заключить поток ввода в оболочку класса StreamReader. StreamReader rdr = new StreamReader(istrm) ; // Прочитать всю страницу, str = rdr.ReadToEndO ; curloc = 0; do { // Найти следующий URI для перехода по ссылке, link = FindLink(str, ref curloc); if(link != null) { Console.WriteLine("Найдена ссылка: " + link); Console.Write("Перейти по ссылке, Искать дальше, Выйти?"); answer = Console.ReadLine(); if(string.Equals(answer, "П", StringComparison.OrdinallgnoreCase)) { uristr = string.Copy(link); break; } else if(string.Equals(answer, "B", StringComparison.OrdinallgnoreCase)) { break; } else if(string.Equals(answer, "И", StringComparison.OrdinallgnoreCase)) { Console.WriteLine("Поиск следующей ссылки."); } } else { Console.WriteLine("Больше ссылок не найдено."); break; } } while(link.Length > 0); // Закрыть ответный поток, if(resp != null) resp.Close(); } while(uristr != null); } catch(WebException exc) { Console.WriteLine("Сетевая ошибка: " + exc.Message + "\пКод состояния: " + exc.Status); } catch(ProtocolViolationException exc) { Console.WriteLine("Протокольная ошибка: " + exc.Message); } catch(UriFormatException exc) { Console.WriteLine("Ошибка формата URI: " + exc.Message); } catch(NotSupportedException exc) { Console.WriteLine("Неизвестный протокол: " + exc.Message); } catch(IOException exc) { Console.WriteLine("Ошибка ввода‑вывода: " + exc.Message); } finally { if(resp != null) resp.Close(); Console.WriteLine("Завершение программы MiniCrawler."); } } Ниже приведен пример сеанса поиска, начиная с адреса www .McGraw‑Hill. com. Следует иметь в виду, что конкретный результат поиска зависит от состояния содержимого на момент поиска. Переход по ссылке http://mcgraw‑hill.com Найдена ссылка: http://sti.mcgraw‑hill.com:9000/cgi‑bin/query?mss=search&pg=aq Перейти по ссылке, Искать дальше, Выйти? И Поиск следующей ссылки. Найдена ссылка: http: //investor .mcgraw‑hill. com/phoenix. zhtml?c=96562&p=irol‑irhome Перейти по ссылке,'Искать дальше, Выйти? П Переход по ссылке http://investor.mcgraw‑hill .com/phoenix. zhtml?c=96562&p=irol‑irhome Найдена ссылка: http://www.mcgraw‑hill.com/index.html Перейти по ссылке, Искать дальше, Выйти? П Переход по ссылке http://www.mcgraw‑hill.com/index.html Найдена ссылка: http://sti.mcgraw‑hill.com:9000/cgi‑bin/query?mss=search&pg=aq Перейти по ссылке, Искать дальше, Выйти? В Завершение программы MiniCrawler. Рассмотрим подробнее работу программы MiniCrawler. Она начинается с ввода пользователем конкретного URI в командной строке. В методе Main () этот URI сохраняется в строковой переменной uristr. Затем по указанному URI формируется запрос, и переменной uristr присваивается пустое значение, указывающее на то, что данный URI уже использован. Далее отправляется запрос и получается ответ. После этого содержимое читается из потока ввода, возвращаемого методом GetResponseStream () и заключаемого в оболочку класса StreamReader. Для этой цели вызывается метод ReadToEnd () , возвращающий все содержимое в виде строки из потока ввода. |