Обратите внимание на то, что вы имеете возможность не только получить список Web-сервисов на своей локальной машине, но и запросить различные каталоги UDDI (соответствующие вопросы будут обсуждаться в конце главы). Так или иначе, в результате ввода в строку URL подходящего значения, указывающего на действительный файл *.wsdl или *.asmx, вы добавите в проект новый класс агента. Заметьте, что пространство имен агента (зависящее от URL источника) будет вложено в рамки пространства имен вашего клиента .NET. Так, если для клиента с именем MyClientApp добавляется ссылка на Web-сервис, размещенный на вашей локальной машине, вы должны указать C#-директиву using следующего вида.
using MyClientApp.localhost;
Замечание. В Visual Studio 2005 диалоговое окно Add Web Reference автоматически либо добавляет в проект новый файл app.config, содержащий значения URL ссылок на Web-сервисы XML, либо обновляет уже существующий.
Доступ к пользовательским типам Web-методов
В заключительном примере этой главы мы с вами выясним, как строить Web-сервисы, предлагающие доступ к пользовательским типам, а также к более "экзотическим" типам из библиотек базовых классов .NET. Для примера мы создадим новый Web-сервис XML, который будет способен обрабатывать массивы, пользовательские типы и объекты DataSet ADO.NET. Сначала создайте новый Web-сервис XML с именем CarSalesInfoWS, размещенный в виртуальном каталоге IIS.
Доступ к массивам
Создайте Web-метод GetSalesTagLines, который возвращает массив строк, представляющих данные текущих продаж различных автомобилей, и метод SortCarMakes, который позволит вызывающей стороне передать массив несортированных строк, чтобы обратно получить новый массив отсортированных строк.
[WebService(Namespace="http://IntertechTraining.com/", Description="Автомобильный Web-сервис", Name="CarSalesInfoWS")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
public class Service: System.Web.Services.WebService {
[WebMethod(Description="Получение рекламных скидок")]
public string[] GetSalesTagLines {
string[] currentDeals = {
"Цены на Colt снижены на 50%",
"Bce BMW комплектуются 8-канальным звуком",
"Caravan бесплатно… спросите у дилера!"
};
return currentDeals;
}
[WebMethod(Description = "Сортировки списка марок")]
public string[] SortCarMakes(string[] theCarsToSort) {
Array.Sort(theCarsToSort);
return theCarsToSort;
}
}
Замечание. Страница тестирования, генерируемая с помощью DefaultWsdlHelpGenerator.aspx, не может вызывать методы, использующие в качестве параметров массивы типов.
Доступ к структурам
Протокол SOAP позволяет передачу XML.предcтавлений пользовательских типов данных (таких как классы и структуры). Web-сервисы XML используют тип XmlSerializer для преобразования типа в XML-код (см. главу 17, где имеется более подробная информация по этому поводу). Напомним, что XmlSerializer:
• не выполняет сериализацию приватных данных: для сериализации используются только открытые поля и свойства;
• требует, чтобы каждый позволяющий сериализацию класс имел конструктор, заданный по умолчанию;
• не требует использования атрибута [Serializable].
С учетом сказанного, наш следующий Web-метод будет возвращать массив структур SalesInfoDetails, определенных следующим образом.
// Пользовательский тип.
public struct SalesInfoDetails {
public string info;
public DateTime dateExpired;
public string Url;
}
Другим интересным моментом в отношении XmlSerializer является то, что этот тип позволяет осуществлять многослойный контроль представления типа. По умолчанию сериализация структуры SalesInfoDetails выполняется путем преобразования каждого поля данных поля в уникальный XML-элемент.
‹SalesInfoDetails›
‹info›Цены на Colt снижены на 50'%!‹/info›
‹dateExpired›2004-12-02T00:00:00.0000000-06:00‹/dateExpired›
‹Url›http://www.CarsRUs.com‹/Url›
‹/SalesInfoDetails›