Главная » Silverlight » Клиентский код

0

На стороне клиента необходима ссылка на сборку System.ServiceModel.Polling- Duplex. dll. Применить ее серверную версию нельзя. Нужно использовать ее версию, принадлежащую надстройке Silverlight. Найти ее можно в папке С: \Program Files\ Microsoft SDKs\Silverlight\v3.0\Libraries\Client.

При создании объекта прокси нужно явно определить дуплексное связывание.

private AsyncTaskServiceClient client;

public MainPageO

{

InitializeComponent() ;

EndpointAddress address =

new EndpointAddress("http://localhost:" + HtmlPage.Document.DocumentUri.Port + "/DuplexService.Web/AsyncTask.svc");

PollingDuplexHttpBinding binding = new PollingDuplexHttpBinding();

client = new AsyncTaskServiceClient(binding, address);

При использовании обычной службы обработчик подключается к событию завер­шения (генерируется по одному событию завершения для каждого метода службы). Дуплексная служба используется аналогично, однако генерируется по одному событию для каждого метода клиентского интерфейса, причем вместо суффикса Completed при­меняется суффикс Received. В данном примере в интерфейсе IAsyncTaskClient опреде­лен единственный метод ReturnResult (), следовательно, класс прокси содержит собы­тие ReturnResultReceived.

client.ReturnResultReceived +=

client_ReturnResultReceived;

!

На рис. 15.4 показано простое клиентское приложение, позволяющее ввести строку текста. Когда пользователь щелкает на кнопке, текст передается службе, которая об­рабатывает его асинхронно. Сервер передает результат клиенту, и новая информация выводится в текстовом блоке, расположенном снизу.

Рис. 15.4. Обработка текста дуплексной службой

Ниже приведен код передачи запроса и получения результата.

private void cmdSubmit_Click(object sender, RoutedEventArgs e)

{

TaskDescription taskDescription = new TaskDescription(); taskDescription.DataToProcess = txtTextToProcess.Text; client.SubmitTaskAsync(taskDescription); lblStatus.Text = "На сервер передан асинхронный запрос";

}

private void client_ReturnResultReceived(object sender, ReturnResultReceivedEventArgs e)

(

try {

lblStatus.Text = "Получен ответ: " +

e.result.ProcessedData;

}

catch

{

lblStatus.Text =

"Обработка задания завершена неуспешно";

}

}

С точки зрения клиентского приложения, модель программирования дуплексной службы почти такая же, как и обычной. Однако есть ряд важных отличий.

•         Клиентское приложение не ждет ответа сервера, а периодически опрашивает порт, пытаясь получить его.

•         Сервер может удерживать ссылку на клиента длительное время и многократно вызывать клиента до завершения метода. Сервер может даже прерывать соеди­нение и с помощью таймера передавать прерывистые обновления клиенту.

•         Сервер может вызывать разные методы клиента из одного и того же метода служ­бы. Служба может вызывать любой метод, определенный в интерфейсе клиента.

Примечание. Дуплексные службы не предназначены для одновременного обслуживания большого количества клиентов. По умолчанию дуплексная служба поддерживает до десяти соединений одновременно. Их количество можно переопределить с помощью кода, приведенного по адресу www. tinyurl. com/m9bdn4. Однако, как правило, дуплексные службы нормально работают при сравнительно небольшом количестве соединений, позволяя запрограммировать обслуживание десятков, но не сотен клиентов.

Резюме

В этой главе рассматриваются способы реализации взаимодействия между служ­бами ASP.NET и кодом Silverlight. Вы научились создавать базовые веб-службы, вы­полнять мониторинг сетевых соединений и определять двустороннюю коммуникацию. В главах 16 и 17 эти технологии применяются для извлечения приложением Silverlight информации, хранящейся в базах данных.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии