Private-Bookers
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
вернуться

Троелсен Эндрю

Шрифт:

}

Обратите внимание на то, что вызывающая сторона передает два параметра, "упакованные" в массив System.Object. Используя динамическое связывание, метод Invoke передаст эти аргументы методу вычитания, размещенному по указанному адресу URL. По завершении этого (блокирующего) вызова будет обработан поступающий XML-код и результат будет возвращен вызывающей стороне в виде System.Int32 после соответствующего преобразования.

Поддержка асинхронного вызова

Поддержка асинхронного вызова Web-методов в .NET 2.0 сильно изменилась по сравнению с .NET 1.x. По своему предыдущему опыту вы можете знать, что агенты .NET 1.1 использовали методы BeginXXX/EndXXX для вызова Web-методов во вторичном потоке выполнения. Рассмотрите, например, следующие методы BeginSubtract и EndSubtract.

public System.IAsyncResult BeginSubtract(int x, int y, System.AsyncCallback callback, object asyncState) {

 return this.BeginInvoke("Subtract", new object[] {x, y}, callback, asyncState);

}

public int EndSubtract (System.IAsyncResult asyncResult) {

 object[] results = this.EndInvoke(asyncResult);

 return ((int) (results[0]));

}

Хотя wsdl.exe все еще генерирует эти знакомые методы Begin/End, в .NET 2.0 они считаются устаревшими, поскольку заменены новыми методами XXXAsync.

public void SubtractAsync(int x, int y) {

 this.SubtractAsync(x, y, null);

}

Новые методы XXXAsync (как и связанный с ними метод CancelAsync) работают в паре с автоматически генерируемым вспомогательным методом (являющимся перегруженной версией некоторого специального метода XXXAsync), который обрабатывает асинхронные операции, используя синтаксис событий C#. Если рассмотреть программный код агента, вы увидите, что wsdl.exe генерирует (для каждого Web-метода) пользовательский делегат, пользовательское событие и пользовательский класс "event args", чтобы получить соответствующий результат.

Создание приложения клиента

Теперь, когда вы лучше понимаете внутреннюю композицию генерируемого агента, давайте попытаемся его использовать. Создайте новое консольное приложение с именем CalculatorClient, добавьте в проект файл proxy.cs с помощью выбора Project->Add Existing Item из меню и добавьте ссылку на компоновочный блок System.Web.Services.dll. Затем измените метод Main так, как предлагается ниже.

class Program {

 static void Main(string[] args) {

Console.WriteLine("***** Забавы c агентами WS *****\n");

// Создание агента.

CalculatorWebService ws = new CalculatorWebService;

// Синхронный вызов метода Add.

Console.WriteLine("10 + 10= {0}", ws.Add(10, 10));

// Асинхронный вызов метода Subtract с помощью

// нового подхода .NET 2.0 на основе событий.

ws.SubtractCompleted += new SubtractCompleteEventHandler(ws_SubtractCompleted);

ws.SubtractAsync(50, 45);

// Продолжение работы консоли для гарантии получения

// результата вычитания.

Console.RеаdLine;

 }

 static void ws_SubtractCompleted(object sender, SubtractCompletedEventArgs e) {

Console.WriteLine("Baш ответ: {0} ", e.Result);

 }

}

Обратите внимание на то, что новая логика асинхронного вызова в .NET 2.0 непосредственно отображается в синтаксис событий C#, который, согласитесь, является более аккуратным по сравнению с использованием методов BeginXXX/EndXXX, интерфейса IAsyncResult и делегата AsyncCallback.

Исходный код. Проект CalculatorClient размещен в подкаталоге, соответствующем главе 25.

Генерирование программного кода агента в Visual Studio 2005

  • Читать дальше
  • 1
  • ...
  • 467
  • 468
  • 469
  • 470
  • 471
  • 472
  • 473
  • 474
  • 475
  • 476

Private-Bookers - русскоязычная библиотека для чтения онлайн. Здесь удобно открывать книги с телефона и ПК, возвращаться к сохраненной странице и держать любимые произведения под рукой. Материалы добавляются пользователями; если считаете, что ваши права нарушены, воспользуйтесь формой обратной связи.

Полезные ссылки

  • Моя полка