Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 312

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 306 307 308 309 310 311 < 312 > 313 314 315 316 317 318 .. 320 >> Следующая

public Service'Л.і {
Initial izeComponentO:
II Добавляем объекты Car
cartist.Add(new Car("Zippy". 170)); cartist.Addtnew Cart"Fred". 80)): carList.Addtnew CarC'Sally". 40)):
}
После этого мы определим в web-службе два метода. GetCarLi st ! будет возвращать весь массив carl і si целиком. GetACarFrortiL і st будет возвращать конкретный объект Cd'" по его номеру в массиве. Вот определения каждого из этих методов:
// Возвращаем конкретный объект Саг
[WebMethod]
public Саг SaetACarFroitutdnt carToGet)
(
it;:5rTu&t <= cart ist.Count; {
return (Car) carList[carToGet];
}
throw new IndexOutOfRangeExceptionO;
}
// Воззращаек массив объектов Саг целиком [WebMethod]
public ArrayList GetCarListO {
return carList;
\
776 Глава 15 • Web-службы
Настраиваем клиента web-службы
Службу уже создали, осталось создать клиента, который к ней будет обращаться. Мы воспользуемся уже готовым клиентом из предыдущего примера (с элементом управления DataGrid). Единственное, что обязательно надо сделать, раз web-служба изменилась, - это обновить web-сслыку, например, из окна Solution Explorer. Мы добавим к графическому интерфейсу нашего клиента две кнопки (для вызова каждого из методов web-службы) и текстовое поле для ввода номера объекта Саг в массиве. Код обработчика события Click для кнопки, которая будет вызывать метод GetACarFromList, будет таким:
protected void btnGetCar_click (object sonder. System.EventArqs e)
bigmanu.Car c;
bicimanu.Servicel cws = new bigmanu.ServicelO: с = cws.GetACarFromtist(int.Parse(txtCarToGet.Text)); MessageBox.Show(c.petName. "Car " + txtCarToGet.Text cws. DisposeO:
is named:");
:
catch }
MessageBox.Show("Ко car with that number...");
Результат запуска нашего клиента представлен на рис. 15.21. Помните, что мы извлекаем информацию об объекте Саг из массива, а не из таблицы Inventory, которая отображается в DataGrid!
IXIUIHJlllUiU—ll ' .IQlxl

Data from the Web
і .н ID Make tnlof PetName Q
BMW BMW Viper BMW
cat
FfKl
I Gel Car Fiom Ы | P~
Gel
Рис. Получаем объект Car из массива на web-службе
Обработчик события для второй кнопки будет выглядеть так:
private void btrArr-dyListCl icH object sender. Sy stem. EventArgs e) t
bigmanu. Service! cws = new bigmanu.ServlceH): objectG objs - cws.GetCarListQ;
+
Создание типов для сериализации (некоторые уточнения) 777
string pethaaus -- "¦.
//Переносим все данные из массива в строковую переменную
forClnt 1-0: і < objs.Length: і++) I
bibmanu.Carc = (bigmanu.Car)objs[i]: petNames +- c.petName + "\n";
}
MessageBox.Show(petNames. "Pet names for cars in array 11st:"): cws.DisposeO; і
Создание типов для сериализации (некоторые уточнения)
При сериализации объекта в формате XML обычно является принципиальным сохранение внутреннего состояния этого объекта — чтобы его можно было потом восстановить (например, на клиенте) и продолжить с ним работу. Чтобы среда выполнения могла внутренние данные объекта, ей необходимо по-
лучить к ним доступ. Однако если мы определили внутренние переменные как pri то получить к ним доступ среда выполнения не сможет. Как мы в нашем примере мы предусмотрительно определили обе переменные как puiV: с:
[XmIIncludettypeof(Car))] public class
(
public string petName: public int maxSpeed;
}
.Предположим, что мы определили их как рг і vate (как положено с точки зрения
культуры программирования):
[XmlInclude(typeof(Car))] public class
5 № Шщ , in, s,
{ petName - n; maxSpeed = s; }
// Попробуем ¦ сериализовать? private string petName; private int maxSpeed;
}
Если мы после этого вызовем метод GetCari." StO, то в массиве также обнаружатся три объекта г. Однако ни для одного из этих объектов не сохранится информация о внутреннем состоянии! Проблема решается просто: надо либо определять переменные как либо создать свойства для доступа к переменным, определенным как private:
[XmIIncludeCtypeof(Car))]
public class
(
778 Глава 15 * Web-службы
private string petName; private int maxSpeed: public string PetName {
get { return petName: } set { petName = value; }
}
public int MaxSpeed
get { return maxSpeed; ) set { maxSpeed = value: )
)
1
В щипните, создание объектов, к которым можно будет обратиться через web-службу, не сильно отличается от создания обычных объектов С#. Главное - не забыть пометить такие объекты атрибутом [Xmllnclude] и обеспечить возможность доступа к данным, определенным как private.
Файл Cars Web Service.asmx.cs можно найти в подкаталоге Chapter 15.
Протокол обнаружения web-службы
Последнее, о чем пойдет речь в этой главе - о службе обнаружения (discovery service) для web-службы и о файлах \disco, которые используются для ее настройки.
Когда клиент обращается к web-службе, первое, что он должен сделать — убедиться, что web-служба по данному адресу существует. В принципе это можно сделать программным образом — в библиотеке базовых классов .NET предусмотрены для этого соответствующие типы. Однако стандартное средство сделать это — использовать службу обнаружения. Кроме того, служба обнаружения также необходима многим средствам разработки (например, она используется при добавлении web-ссылки в проект С#).
Предыдущая << 1 .. 306 307 308 309 310 311 < 312 > 313 314 315 316 317 318 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100