Кроме вышеупомянутых приватных членов, класс Weatherlnf о имеет не¬сколько приватных методов. Один из таких методов, _getWebWeather(), обращается за рассылкой к удаленному узлу и возвращает строку, со¬держащую информацию из рассылки:
private string _getWebWeather()
string xmlStr = String.Empty;
return xmlStr;
Данные, заключенные в квадратные скобки, - это идентификатор ме¬стоположения, идентификатор участника и ключ лицензионного со-глашения. Вставить свои данные в URL можно посредством метода
String. Format():
string basellrl =
"http;//xoap; weather; com/weather/local/{0}?cc=*&prod=xoap&par={1}ikey='(2}";
- string url = String.Format(baseUrl, _settings.LocationId, _settings.PartnerId, .settings.LicenseKey);
Это единственное место, где используется объект settings. Получив¬шаяся строка содержит всю необходимую информацию, предписывае¬мую условиями Weather.com.
Затем метод _getWebWeather() выполняет запрос к удаленному серверу и получает рассылку с информацией о погоде:
using (WebClient client = new WebClientO)
// прочитать результаты try
using (StreamReader reader = new StreamReader(client.OpenRead(url))) {
xmlStr = reader. ReadToEndO;
catch (WebException exception)
xmlStr = _writeErrorOoc(exception);
Этот фрагмент кода начинается с создания объекта WebClient. еще помните, в главе 5 мы получали данные от удаленного сервера мощью объекта HttpWebRequest. То же самое мы могли бы сделать час, но WebClient имеет более простой интерфейс, в чем вы мод диться сами.
Ответ сервера позволяет прочитать метод OpenReadO. Он возв объект класса Stream, прочитать данные из которого можно поср экземпляра класса StreamReader. Метод ReadToEndO класса Stre считывает данные из потока и возвращает их в виде строки, записывается в переменную xmlStr. Если по каким-либо прич операция терпит неудачу (наиболее вероятная причина- не ность установить соединение с удаленным сервером), то с помо тода _writeErrorDoc() создается документ с сообщением об ош торый записывается в переменную xmlSt г вместо информации о
К этому моменту мы имеем документ XML, в котором содерж формация о погоде или сообщение об ошибке. Теперь необхо полнить XSL-преобразование полученного документа. Пре ние на стороне сервера имеет свои преимущества. Во-первых, ется программный код клиентской части приложения. Д правляются клиенту уже в формате HTML и, таким образом, могут быть добавлены к странице. Кроме того, преобразование роне сервера уменьшает нагрузку на клиента, от которого не ■ ся никакие дополнительные действия и которому остается л местить данные на страницу.
Порядок выполнения преобразований XSL в .NET очень сильно минает порядок выполнения преобразований с помощью MSXML, тором мы рассказывали в главе 4. На первом шаге преобразо даются все необходимые объекты:
XslTransform xslt = new XslTransform(); XmlDocument xml = new XmlDocumentQ; using (StringWriter stringWriter = new StringWriterQ) {
Для преобразования XSL в .NET нам потребуются объекты XsIFi form, XmlDocument и StringWriter, в последнем из которых будет щаться результат преобразования. На следующем шаге преоб: ния необходимо загрузить документ XML в объект XmlDocument: мент XSL в объект XslTransform:
xml.LoadXml(xmlSt г); xslt.Load(_path + "/weather.xslt");
Метод LoadXml () класса XmlDocument напоминает метод loadXml : лиотеки MSXML. В качестве аргумента он принимает строку с . ментом XML. Документ XSL загружается в объект XslTransform с
шью метода Load (), которому в качестве аргумента передается строка, содержащая путь к документу XSL.
Заключительный шаг в преобразовании - извлечение результата из объ¬екта St ringWrite
Метод TransformO имеет несколько перегруженных версий. Перегру¬женные методы - это методы с тем же самым именем, выполняющие те же самые действия, но принимающие различные типы аргументов. Данная версия перегруженного метода принимает первым аргументом документ XML, вторым - список параметров (или аргументов), пере¬даваемых процессору XSLT, третьим - объект StringWriter, куда будут выводиться результаты преобразования, и последним аргументом-обработчик пространств имен XmlResolver. Результаты преобразования можно извлечь посредством метода ToString() объекта StringWriter.
Напоследок метод _getWebWriter() записывает данные в кэш. Эта опера¬ция выполняется с помощью объекта StreamWriter, который записыва¬ет данные в кодировке UTF-8:
using (StreamWriter writer = new StreamWriter( cachedFile)) writer.Wrlte(xmlStr);
Конструктор класса StreamWriter принимает в виде аргумента строку, содержащую путь к файлу, куда будут выводиться результаты. Объект St reamWrite г записывает содержимое строки xmlSt г в файл, который тут же закрывается, а сам объект уничтожается сразу же по выходе за пре¬делы блока using.
Чтобы приложение могло обновлять содержимое файла weather_.cache.xml, ядро ASP.NET должно иметь соответствующие права доступа к файлу.
Ниже приводится полный текст метода _getWebWeather():
private string _getWebWeather() {
// Только ради того, чтобы сделать исходный код более прозрачным: string baseUrl = "http://xoap.weather.com/weather/local/ {0}?сс=*&р rod=xoap&pa г={1}&кеу={2}";
// Теперь сконструировать url, вставив в него необходимую информацию string url = String.Format(baseUrl, .settings.Locationld, ч.
' .settings.Partnerld, .settings.LicenseKey);
// Строка, куда будет записана информация о погоде string xmlStr = String.Empty;
// Использовать класс WebClient. // Благодаря ему уменьшается объем.исходного текста // по сравнению с HttpWebRequest. using (WebClient client = new WebClientO)
// Прочитать результат
using (StreamReader reader =
new StreamReader(client.OpenRead(url)))
xmlStr = reader. ReadToEndQ;
catch (WebException exception)' '
xmlStr = _writeErrorDoc(exception); - • ;-
XslTransform xslt = new XslTransformO; = - •
XmlDocument xml = new XmlDocumentQ;
using (StringWriter sringWriter '= new StringWriterQ)
xml.LoadXml(xmlStr); ' '
xslt.Load(_path + "/weather.xslt"); xslt.Transform(xml,null,sringWriter,null); xmlStr = sringWriter.ToStringO;-
II Записать данные в кэш
using (StreamWriter writer. = new StreamWriter( cachedFile)) {
writer.Write(xmlStr);
II И вернуть сведения о состоянии погоды! return xmlStr;
Чтение данных из кэша
Другой приватный метод класса Weatherlnfo - _getCachedWeather( следует из его названия, он предназначен для извлечения да кэша. Подобно предыдущему методу, метод _getCachedWeather() щает в качестве результата строку:
private string _getCachedWeather()
string str = String.Empty, • -.-.>•
// Открыть файл кэша и прочитать из него данные о погоде, using (StreamReader reader = new StreamReader(_cachedFile))
Сначала создается переменная str, которая инициализируется пустой строкой. В эту переменную будет помещено содержимое файла кэша. Затем создается объект StreamReader, и с его помощью открывается файл кэша с информацией о погоде. Затем содержимое файла считыва-ется с помощью метода ReadToEndO и помещается в переменную str. В заключение метод _getCachedWeather() возвращает эту строку в вызы¬вающую функцию.
Методы _getWebWeather() и _getCachedWeather() - это главные «рабочие лошадки» приложения. Но вы наверняка обратили внимание на то, что эти методы приватные. Другими словами, к ним нельзя обратить¬ся извне. Доступ к этим двум методам организован через публичный метод GetWeather().