Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Название:ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2007
- Город:Москва • Санкт-Петербург • Киев
- ISBN:ISBN 5-8459-1124-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание краткое содержание
В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML. Книга содержит множество примеров программного кода, призванного помочь читателю в освоении предлагаемого материала. Программный код примеров можно загрузить с Web-сайта издательства.
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
В качестве замечания подчеркнем, что wsdl.exe не определяет пространство имен .NET для упаковки генерируемых типов C#. если вы не укажете в командной строке флаг /n.
wsdl /out:proxy.cs /n:CalculatorClient http://localhost/CalcService/ Service.asmx?wsdl
Программный код агента
Если открыть сгенерированный файл агента, вы найдете там тип, который получается из System.Web.Services.Protocols.SoapHttpClientProtocol (если, конечно, вы не указали другой протокол связи с помощью опции /protocol).
public partial class CalculatorWebService:
System.Web.Services.Protocols.SoapHttpClientProtocol {
…
}
Этот базовый класс определяет ряд членов, используемых в рамках реализации типа агента. Описания некоторых из этих членов предлагаются в табл. 25.7.
Таблица 25.7.Основные члены типа SoapHttpClientProtocol
Унаследованные члены | Описание |
---|---|
BeginInvoke() | Метод, инициирующий асинхронный вызов Web-метода |
CancelAsync() | Метод (новый в .NET 2.0), отменяющий асинхронный вызов метода Web-сервиса XML, если вызов еще не завершен |
EndInvoke() | Метод, завершающий асинхронный вызов Web-метода |
Invoke() | Метод для синхронного вызова метода Web-сервиса |
InvokeAsync() | Метод (новый в .NET 2.0), предлагающий более предпочтительный вариант асинхронного вызова метода Web-сервиса |
Proxy | Свойство, получающее или устанавливающее информацию агента для запроса Web-сервиса через брандмауэр |
Timeout | Свойство, получающее или устанавливающее значение времени ожидания (в миллисекундах) для синхронных вызовов |
Url | Свойство, получающее или устанавливающее базовое значение URL сервера для запросов |
UserAgent | Свойство, получающее или устанавливающее значение для заголовка пользовательского агента в запросах |
Конструктор, заданный по умолчанию
Заданный по умолчанию конструктор агента "жестко" определяет значение 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: CalcUrlhttp://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 , int y) {
object[] results = this.invoke("Subtract", new object[] {x, y});
return ((int)(results[0]));
}
Обратите внимание на то, что вызывающая сторона передает два параметра, "упакованные" в массив 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.
Читать дальшеИнтервал:
Закладка: