Герберт Шилдт - C# 4.0 полное руководство - 2011
Если ссылка, возвращаемая методом FindLink (), не является пустой, то она отображается в методе Main (), и далее программа запрашивает у пользователя очередные действия. Пользователю предоставляются одна из трех следующих возможностей: перейти по найденной ссылке, нажав клавишу <П>, искать следующую ссылку в имеющемся содержимом, нажав клавишу <И>, или же выйти из программы, нажав клавишу <В>. Если пользователь нажмет клавишу <П>, то программа осуществит переход по найденной ссылке и получит новое содержимое по этой ссылке. После этого поиск очередной ссылки будет начат уже в новом содержимом. Этот процесс продолжается до тех пор, пока не будут исчерпаны все возможные ссылки.
В качестве упражнения вы сами можете усовершенствовать программу MiniCrawler, дополнив ее, например, возможностью перехода по относительным ссылкам. Сделать это не так уж и трудно. Кроме того, вы можете полностью автоматизировать поисковый робот, чтобы он сам переходил по найденной ссылке без вмешательства со стороны пользователя, начиная со ссылки, обнаруженной на самой первой странице полученного содержимого, и продолжая переход по ссылкам на новых страницах. Как только будет достигнут тупик, поисковый робот должен вернуться на один уровень назад, найти следующую ссылку и продолжить переход по ссылке. Для организации именно такого алгоритма работы программы вам потребуется стек, в котором должны храниться идентификаторы URI и текущее состояние поиска в строке URL С этой целью можно, в частности, воспользоваться коллекцией класса Stack. В качестве более сложной, но интересной задачи попробуйте организовать вывод ссылок в виде дерева.
Применение класса WebClient
В заключение этой главы уместно рассмотреть класс WebClient. Как упоминалось в самом ее начале, класс WebClient рекомендуется использовать вместо классов WebRequest и WebResponse в том случае, если в приложении требуется лишь выгружать или загружать данные из Интернета. Преимущество класса WebClient заключается в том, что он автоматически выполняет многие операции, освобождая от их программирования вручную.
В классе WebClient определяется единственный конструктор.
public WebClient()
Кроме того, в классе WebClient определяются свойства, сведенные в табл. 26.6, а также целый ряд методов, поддерживающих как синхронную, так и асинхронную передачу данных. Но поскольку рассмотрение асинхронной передачи данных выходит за рамки этой главы, то в табл. 26.7 приведены только те методы, которые поддерживают синхронную передачу данных. Все методы класса WebClient генерируют исключение WebException, если во время передачи данных возникает ошибка.
Таблица 26.6. Свойства, определенные в классе WebClient
Свойство
Описание
public string BaseAddress { get; set; }
public RequestCachePolicy CachePolicy { get; set; } public ICredentials Credentials { get; set; }
public Encoding Encoding { get; set; }
Получает или устанавливает базовый адрес требуемого URI. Если это свойство установлено, то адреса, задаваемые в методах класса WebClient, должны определяться относительно этого базового адреса Получает или устанавливает правила, определяющие, когда именно используется кэш1 Получает или устанавливает мандат, т.е. учетные данные пользователя. По умолчанию это свойство имеет пустое значение
Получает или устанавливает схему кодирования символов при передаче строк
Свойство
Описание
public WebHeaderCollection Headers! get; set; } public bool IsBusy( get; }
public IWebProxy Proxy { get; set; }
,public NameValueCollection QueryString { get; set; }
public WebHeaderCollection ResponseHeaders{ get; } public bool
UseDefaultCredentials { get; set; }
Получает или устанавливает коллекцию заголовков запроса
Принимает логическое значение true, если данные по-прежнему передаются по запросу, а иначе — логическое значение false Получает или устанавливает прокси-сервер
Получает или устанавливает строку запроса, состоящую из пар “имя-значение”, которые могут быть присоединены к запросу. Строка запроса отделяется от URI символом ?. Если же таких пар несколько, то каждая из них отделяется символом 0 Получает коллекцию заголовков ответа
Получает или устанавливает значение, которое определяет, используется ли для аутентификации устанавливаемый по умолчанию мандат. Если принимает логическое значение true, то используется мандат, устанавливаемый по умолчанию, т.е. учетные данные пользователя, в противном случае этот мандат не используется
Таблица 26.7. Методы синхронной передачи, определенные в классе WebClient
Метод
Определение
public byte[]
Загружает информацию по адресу UR1, обозначае
DownloadData(string address)
мому параметром address. Возвращает результат в виде массива байтов
public byte[]
Загружает информацию по адресу URI, обозначае
DownloadData(Uri address)
мому параметром address. Возвращает результат в виде массива байтов
public void
Загружает информацию по адресу URI, обозначае
DownloadFile(string uri,
мому параметром fileName. Сохраняет результат
string fileName)
в файле fileName
public void DownloadFile(Uri
Загружает информацию по адресу URI, обозначае
address, string fileName)
мому параметром address. Сохраняет результат в файле fileName
public string
Загружает информацию по адресу URI, обозначае
DownloadString(string
мому параметром address. Возвращает результат
address)
в виде символьной строки типа string
public string
Загружает информацию по адресу URI, обозначае
DownloadString(Uri address)
мому параметром address. Возвращает результат в виде символьной строки типа string
public Stream
Возвращает поток ввода для чтения информации по
OpenRead(string address)
адресу URI, обозначаемому параметром address. По окончании чтения информации этот поток необходимо закрыть
Метод
Определение
public Stream OpenRead(Uri
Возвращает поток ввода для чтения информации по
address)
адресу URI, обозначаемому параметром address. По окончании чтения информации этот поток необходимо закрыть
public Stream
Возвращает поток вывода для записи информа
OpenWrite(string address)
ции по адресу URI, обозначаемому параметром address. По окончании записи информации этот поток необходимо закрыть
public Stream OpenWrite(Uri
Возвращает поток вывода для записи информа
address)
ции по адресу URI, обозначаемому параметром address. По окончании записи информации этот поток необходимо закрыть
public Stream
Возвращает поток вывода для записи информа
OpenWrite(string address,
ции по адресу URI, обозначаемому параметром
string method)
address. По окончании записи информации этот
поток необходимо закрыть. В строке, передаваемой в качестве параметра method, указывается, как именно следует записывать информацию
public Stream OpenWrite(Uri
Возвращает поток вывода для записи информа
address, string method)
ции по адресу URI, обозначаемому параметром address. По окончании записи информации этот поток необходимо закрыть. В строке, передаваемой в качестве параметра method, указывается, как именно следует записывать информацию
public byte[]
Записывает информацию из массива data по
UploadData(string address,
адресу URI, обозначаемому параметром address.
byte[] data)
В итоге возвращается ответ
public byte[] UploadData(Uri
Записывает информацию из массива data по
address, byte[] data)
адресу URI, 'обозначаемому параметром address. В итоге возвращается ответ
public byte[]
Записывает информацию из массива data по