Для определения списка отображаемых рассылок приложение Fo ader.NET использует свой собственный документ XML, который i вается feeds, xml. Этот документ содержит список рассылок, досту по запросу пользователя. Этот файл содержит набор элементов . Каждый эле» имеет атрибут filename, напоминающий атрибут id языка] метки HTML; он должен быть уникальным и однозначно идентифв ровать элемент :
<?xml version="1.0" encoding="utf-8"?>
Это фрагмент типичного списка рассылок. Список рассылок может(| держать столько элементов и , сколько потребуе
Обратите внимание: элемент может находиться только внут-■ корневого элемента документа, а элемент - только внутри ааементов .
Значение атрибута name элементов и будет отобра¬жаться перед пользователем в панели Feeds (Рассылки) и не будет использо¬ваться для каких-либо других действий.
При выполнении запроса рассылки значение атрибута filename будет кшсваиваться параметру строки запроса xml:
xml.aspx?xml=fileName
В ASP.NET объект Request содержит массив типа NameValueCollection еименем QueryString. Этот массив позволяет извлечь значение пере¬менной xml из строки запроса:
if (Request.QueryString["xml"] != null) <
string xml = Request.QueryString["xml"];
FeedsFile feedsFile = new FeedsFile(Server.MapPath("feeds.xml"));
Впервой строке проверяется наличие переменной xml в строке запроса. Затем значение присваивается переменной xml и создается экземпляр ебъекта FeedsFile.
асе FeedsFile содержит метод с именем GetLinkByFileName, который воз¬вращает объект FeedsFilelink, содержащий информацию о выбранном ааементе . Далее в строковую переменную filename записывает¬ся путь к файлу с рассылкой в кэше (этот путь нам еще пригодится):
FeedsFileLink link = feedsFile.GetLinkByFileName(xml); string fileName = string.Format(
@"{0}\xml\{1}.xml",Server.MapPath(String.Empty),link.FileName);
Метод String. Format(), как следует из его названия, подразумевает форма¬тирование строки. Первым аргументом методу передается строка формата. Обычно эта строка содержит символы, называемые элементами формата, ко¬торые выглядят как {0}, {1}, {2} и т. д. Эти элементы замещаются соот¬ветствующими входными аргументами метода. В данном примере элемент {0} замещается результатом вызова метода Server. MapPath(St ring. Empty). Оператор & в начале строки говорит компилятору о том, что не надо обраба¬тывать символы экранирования в строке. Строка, показанная в примере вы¬ше, могла бы быть записана как "{0}\\xml\\{1}. xml", и результат от этого не изменился бы.
Платформа .NET предоставляет класс HttpWebRequest, содержащийся ■ пространстве имен System. Net, который выполняет запросы к удален¬ным веб-серверам. Кроме этого класса платформой .NET предоставля¬ется еще целый ряд классов, позволяющих выполнять запросы (среди ; и универсальный класс WebRequest), но класс HttpWebRequest выпол-запросы HTTP, поэтому он лучше других подходит для данного
приложения. Чтобы создать объект HttpWebRequest, надо вызвать м Create() класса WebRequest и привести его к типу HttpWebRequest:
HttpWebRequest getFeed = (HttpWebRequest) WebRequest.Create(link.Url); getFeed.UserAgent = "FooReader.NET (http://reader.wdonline.com)"; string feedXml = String.Empty;
Одна из характерных особенностей HttpWebRequest, имеющих отн ние к протоколу HTTP, - это свойство UserAgent. Использовать свойство совершенно не обязательно, но оно помогает точно о лить тип приложения, обратившегося к серверу. Большинство торов обычно имеют собственную строку самоидентификации, т же строку имеет и наше приложение FooReader.NET. Переме f eedXml создается как пустая строка. Позднее в эту переменную ' записано содержимое рассылки. Затем необходимо послать з удаленному серверу и получить от него ответ:
// Получить ответ.
using (HttpWebResponse responseFeed =
(HttpWebResponse) getFeed.GetResponse())
{
// Создать обьект для чтения входного потока, using (StreamReader reader = new St reamReade r(responseFeed.GetResponseSt ream())) {
// Прочитать содержимое. feedXml = reader. ReadToEndO;
>
}
Объект HttpWebResponse создается вызовом метода GetResponseO HttpWebRequest. Затем создается объект StreamReader вызовом метода ResponseStreamO класса HttpWebRequest, который далее считывает жимое ответа. Содержимое потока «считывается» в переменную Xml, объявленную ранее. Поскольку при создании объектов Htt Response и StreamReader использовался оператор using, они будут ректным образом уничтожены и не требуют явного закрытия.