|
Программирование >> Программирование с использованием ajax
Асинхронный вызов службы При отправке сообщения по сети всегда нужно учитывать сетевую задержку. При синхронном вызове Web-службы клиентское приложение блокируется до момента возвращения вызова. В локальной сети это может происходить достаточно быстро. Однако следует уделить внимание инфраструктуре сети производственной системы. Сообщения Web-службе можно отправлять асинхронно. Прокси-клиент создает не только синхронные методы, но и асинхронные, однако при использовании Windows-приложений ситуация носит особый характер. Поскольку каждый элемент управления Windows связан с единственным потоком, методы и свойства элементов управления Windows могут вызываться только из создающего потока. Прокси-класс .NET 3.5 предоставляет ряд специальных функциональных возможностей, как видно из сгенерированного кода прокси-объекта. фактическое заняти АсинхрОННЫЙ ВЫЗОВ СЛужбы На этот раз применим асинхронную реализацию прокси-класса. 1. Внесите изменение в код сгенерированного прокси-класса, выбрав ссылку службы WebServicesSample. Откройте контекстное меню и выберите команду Configure Service Reference (Конфигурировать ссылку службы). Откроется диалоговое окно Service Reference Settings (Настройки ссылки на службу), показанное на рис. 21.13. S№ip(eCH nLW bS*rvtcMS mptt гЛС9 ЯвФяппс Addmi Acceii lr n lor gpfitiated cUiiei D > Type urv ,5 g *i rttP m*f.jg, cont.ert, Co tt on tjipe птур< RruJ* 1>р*1 >o eO iff fnccd ijrmb r j Uf trPf 1 iPf c< > if ff need lem Jmjtoruc if JVI** !!: JSyitenCore jfj JISrfmDsH ; f OSotf m Data D taS tbiem orn ; У -JS it m DtplOTfTifnt ; j TJS,jlfmD<awrfifl J Г -ISrUtm Runtimt Sf. i(;*tion i -JSjitfm SffvxtModfl Puc. 21.13. Диалоговое сжпо Service Reference Settings 2. В диалоговом окне Service Reference Settings установите флажок Generate asynchronous operations (Генерировать асинхронные операции). 3. Чтобы вызывать Web-службу асинхронно, измените реализацию метода buttonlClick (код приведен ниже). После того как экземпляр прокси-объекта создан, добавьте к событию ReverseStringCompleted обработчик по имени clientReverseStringCompleted. Затем вызовите асинхронный метод прокси-объекта ReverseStringAsync и передайте ему свойство Text из textBoxl. Метод asnyc создает поток, который выполняет обращение к Web-службе: private void buttonl Click(object sender, EventArgs e) { Асинхронная версия WebServicesSample.ServicelSoapClient client = new WebServicesSample.ServicelSoapClient(); client. ReverseStringCon5>leted += new EventHandler<WebServicesSaziple. ReverseStringCoinpletedEventAr9s> ( client ReverseStringCoi4>leted) ; client.ReverseStringAsync(textBoxl.Text); 4. Теперь реализуйте метод обработчика clientReverseStringCompleted: private void client ReverseStringCompleted(object sender, WebServicesSample.ReverseStringCompletedEventArgs e) textBox2.Text = e.Result; Этот метод будет вызываться по завершении вызова Web-службы. При данной реализации свойство Result параметра ReverseStringComletedEventArgs передается свойству Text объекта textBox2. 5. Теперь можно запустить клиентское приложение еще раз, чтобы протестировать асинхронный вызов службы. В реализацию Web-службы можно добавить также интервал приостановки, чтобы убедиться, что интерфейс пользователя клиентского приложения не блокируется на время вызова Web-службы. Описание полученных результатов Следующий фрагмент кода представляет асинхронную версию метода ReverseString О . Асинхронная реализация прокси-класса всегда содержит метод, который можно вызывать асинхронно, и событие, позволяющее определять, какой метод должен вызываться по завершении метода Web-службы. Рассмотрим эти особенности подробнее. Метод ReverseStringAsync () содержит только те параметры, которые отправляются серверу Считывание данных, полученных от клиента, можно выполнять, присваивая обработчик события событию ReverseStringCompleted, имеющему тип EventHandler<ReverseStringCompletedEventArgs>. Он представляет собой делегат, в то время как второй параметр (ReverseStringCompletedEventArgs) создается из выходных параметров метода ReverseString (). Свойство Result класса ReverseStringCompletedEventArgs содержит возвращаемые данные Web-службы. Эта реализация работает благодаря делегату SendOrPostCallback. Он направляет вызов в нужный поток элемента управления Windows Forms: public event System.EventHandler<ReverseStringCompletedEventArgs> ReverseStringCompleted; public void ReverseStringAsync(string message) { this.ReverseStringAsync(message, null); public void ReverseStringAsync(string message, object userState) { if ((this.onBeginReverseStringDelegate == null)) { this.onBeginReverseStringDelegate = new BeginOperationDelegate(this.OnBeginReverseString); if ((this.onEndReverseStringDelegate == null)) { this.OnEndReverseStringDelegate = new EndOperationDelegate(this.OnEndReverseString); if ((this.onReverseStringCompletedDelegate == null)) { this.onReverseStringCompletedDelegate = new System.Threading.SendOrPostCallback( this.OnReverseStringCompleted); base.InvokeAsync(this.onBeginReverseStringDelegate, new object[ message}, this.onEndReverseStringDelegate, this.onReverseStringCompletedDelegate, userState); public void OnReverseStringOperationCompleted (ob:)ect arg) { if ((this.ReverseStringCompleted !=null)) { InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state)); this.ReverseStringCompleted(this, new ReverseStringCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState)); public partial class ReverseStringCompletedEvenArgs : System.ComponentModel.AsyncCompletedEventArgs private object [ ] results; internal ReverseStringCompletedEventArgs(object[] results. System.Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) { this.results = results; public string Result { get { this.RaiseExceptionlfNecessary 0; return ((string)(ths.results[0])); Реализация клиента ASP.NET Теперь эту же службу можно использовать из клиентского приложения ASP.NET. Ссылка на службу может выполняться так же, как в приложении Windows Forms. Практическое занята Создание клиентского приложения ASRNET 1. Откройте ранее созданную Web-службу WebServi сеs Sample. 2. Добавьте в решение новый Web-сайт С# ASP.NET, назовите его ASPNETClient и добавьте в Web-форму два текстовых поля и кнопку, как показано на рис. 21.14. 3. Добавьте ссылку на службу http: localhost/web-servicesample/service.asmx, как это было выполнено в Windows-приложении. В зависимости от кон- Рис. 21.14. Форма сайта кретной конфигурации может потребоваться указа- ASPNETClient ние номера порта.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |