Web-служба Customer (Клиент)
Чтобы создать Web-службу Customer (Клиент), мы создадим с помощью шаблона Managed C++ Web Service (Web-служба на управляемом C++) проект Web-службы и назовем его CustomerWebService. Этот проект будет использован компонентом Customer (Клиент) для реализации деталей Web-службы. Ниже приведено содержимое файла CustomerWebService.asmx, который входит в состав проекта.
<%@ WebService class = "CustomerWebService.CustomerWebService" %>
А вот и код, реализующий класс CustomerWebService:
public _gc class CustomerWebService: public WebService // класс сборщика мусора CustomerWebService: WebService { private: // частный Customers * customers; // Клиенты public: CustomerWebService () { customers = new Customers("HotelBroker"); // клиенты = новые Клиенты ("HotelBroker"); } [WebMethod] int RegisterCustomer( String *firstName, // Строка String *lastName, // Строка String *emailAddress) // Строка { int customerId; customerld = customers › RegisterCustomer(// клиенты firstName, lastName, emailAddress); return customerld; } [WebMethod] void UnregisterCustomer(int customerId) { customers › UnregisterCustomer(customerld); // клиенты } [WebMethod] [Xmllnclude(_typeof(CustomerListltem))] ArrayList *GetCustomer(int customerld) { ArrayList *ar; ar = customers › GetCustomer(customerld); // клиенты return ar; } [WebMethod] void ChangeEmailAddress( int customerld, String *emailAddress) { customers › ChangeEmailAddress(// клиенты customerld, emailAddress); } };
В коде содержится единственный незнакомый нам атрибут Xmllnclude. Он указывает, что для преобразования определенного пользователем типа данных, в нашем случае CustomerListltem, XmlSerializer обычно может создать протокол SOAP. Этот атрибут находится в пространстве имен System::Xml::Serialization (Система::Xml:: Преобразование в последовательную форму). Тем не менее, если вы посмотрите на класс-заместитель данной Web-службы, который расположен в каталоге WebService-Proxies, вы увидите, что заместитель GetCustomer (customerproxy.cs) возвращает только массив объектов.
public object[] GetCustomer(int customerld) // общедоступный объект[] GetCustomer(int customerld)
Данный атрибут указывает, что параллельно-последовательный преобразователь должен сохранить тип данных, определенный пользователем. Однако по протоколу SOAP могут передаваться лишь универсальные типы объектов. Поэтому код программы AcmeLib (содержится в файле Acme.cs) должен обрабатывать возвращаемый тип как объект, а затем извлечь из него тип, определенный пользователем.
object[] al = customers.GetCustomer(hotelCustomerld); foreach(CustomerListltem cust in al) { currentUser.HotelCustomerld = hotelCustomerld; currentUser.FirstName = cust.FirstName; currentUser.LastName = cust.LastName; currentUser.EmailAddress = cust.EmailAddress; }
Все другие объекты компонентов Customer (Клиент) и Hotel (Гостиница) рассматриваемой Web-службы, которые содержатся в списке ArrayList, трактуются как массивы объектов, из которых нужно извлечь требуемый тип. Те массивы, которые используют такие типы данных, как строки и целые числа, обрабатывать с помощью XmlSerializer нет необходимости.