Главная страница

программирование. Руководство su P# a n Reference в herbert schildt полное руководство с 0 герберт шилдт


Скачать 3.32 Mb.
НазваниеРуководство su P# a n Reference в herbert schildt полное руководство с 0 герберт шилдт
Анкорпрограммирование
Дата25.01.2022
Размер3.32 Mb.
Формат файлаrtf
Имя файлаc-40-polnoe-rukovodstvo-2011.rtf
ТипРуководство
#341448
страница94 из 97
1   ...   89   90   91   92   93   94   95   96   97

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 "); return;

}

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 "); return;

}

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 "); return ;

}

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 () , возвращающий все содержимое в виде строки из потока ввода.
1   ...   89   90   91   92   93   94   95   96   97


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