Читать «ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание» онлайн - страница 700
Эндрю Троелсен
Конструктор, заданный по умолчанию
Заданный по умолчанию конструктор агента "жестко" определяет значение URL удаленного Web-сервиса и запоминает это значение в наследуемом свойстве Url.
public CalculatorWebService() {
this.Url = "http://localhost/CalcServicе/Service.asmx";
}
Очевидным недостатком такого подхода является то, что при переименовании или перемещении Web-сервиса XML класс агента приходится обновлять и перекомпилировать. Для построения более гибкого типа агента wsdl.exe предлагает использовать флаг /appsettingurlkey (который можно сократить до /urlkey). Если указать в командной строке этот флаг, конструктор агента будет содержать программную логику для чтения URL с помощью ключа, содержащегося в файле *.config клиента.
wsdl /out:proxy.cs /n:СаlcClient /urlkey:CalcUrl http://localhost/CalcService/Serviсе.asmx?wsdl
Если теперь проверить конструктор агента, заданный по умолчанию, вы обнаружите следующий программный код (заметьте, что если подходящий ключ не будет найден, в качестве резервного будет использоваться заданное конкретное значение URL).
public CalculatorWebService() {
string urlSetting = System.Configuration.ConfigurationManager.AppSettings["CalcUrl"];
if ((urlSetting != null)) {
this.Url = urlSetting;
} else {
this.Url = "http://localhost./CalcService/Service.asmx";
}
}
Соответствующий файл app.config на стороне клиента будет примерно таким.
‹?xml version="1.0" encoding="utf-8"?›
‹configuration›
‹appSettings›
‹add key="CalcUrl" value="http://localhost/CalcService/Service.asmx" /›
‹/appSettings›
‹/configuration›
Поддержка синхронного вызова
Генерируемый агент определяет также поддержку синхронного вызова Web-методов. Например, синхронный вариант метода Subtract() реализуется так.
public int Subtract(int x
object[] results = this.invoke("Subtract", new object[] {x, y});
return ((int)(results[0]));
}
Обратите внимание на то, что вызывающая сторона передает два параметра, "упакованные" в массив System.Object. Используя динамическое связывание, метод Invoke() передаст эти аргументы методу вычитания, размещенному по указанному адресу URL. По завершении этого (блокирующего) вызова будет обработан поступающий XML-код и результат будет возвращен вызывающей стороне в виде System.Int32 после соответствующего преобразования.