Как служба WCF взаимодействует с моим приложением winform? - PullRequest
2 голосов
/ 16 ноября 2011

В настоящее время я разрабатываю C # Windows Form Application, который я намерен разрешить взаимодействовать с сервером.Сервер будет получать сообщения из разработанного мною мобильного приложения, и при получении сообщения мое приложение Windows Form должно быть уведомлено и уведомить меня.Для этого я намерен использовать для этого дуплексный сервис WCF.

Например, мое мобильное приложение отправляет сообщение на мой сервер.Как только мой сервер прочитает и получит новую публикацию, служба должна отправить сообщение в мое приложение winform, чтобы предупредить меня о получении публикации.И пользовательский интерфейс приложения winform должен обновляться в соответствии с тем, что я хочу обновить.(например, добавление новых панелей)

Это в основном то, как я хочу, чтобы это работало. Вот как это будет работать:

  1. Служба WCF работает на моем сервере
  2. Форма Windows подключается к службе WCF моего сервера с использованием дуплексного контракта
  3. Сообщения мобильного приложения на веб-странице
  4. Как только веб-страница получает сообщение, asp.net вызывает службу WCF
  5. Служба WCF duplex получает публикацию и отправляет информацию в приложение winform
  6. Мое приложение winform, также известное как клиент WCF, обновляет пользовательский интерфейс при получении этого нового сообщения

Мой вопрос: как выполнить шаг4 перейти к шагу 5?А именно, как служба отправляет информацию в приложение winform после получения публикации.

Чтобы быть более точным, после получения публикации с веб-страницы вызывается контракт на обслуживание и информацияотправляется и принимается службой, как служба использует канал обратного вызова для отправки информации в приложение winform и соответственно обновляет пользовательский интерфейс?

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

Ответ на этот вопрос зависит от того, как размещена ваша служба WCF и насколько «большой» она будет в конечном итоге (с точки зрения количества одновременных клиентов).

  • Самым простым сценарием является служба WCF с собственным размещением (т.е. размещенная в службе Windows или в виде приложения для настольного компьютера, а не в IIS). В этом случае вы можете использовать режим InstancePerSession и сделать так, чтобы ваша служба использовала сеансы. В этом случае у вас будет соответствие 1: 1 между клиентами и экземплярами вашего класса обслуживания. Когда клиент подключается, получите ссылку на обратный вызов и сохраните ее в статическом списке за пределами класса обслуживания. Когда вам нужно отправить сообщение одному или нескольким клиентам, просто переберите (или найдите в нем нужного клиента) свой список и вызовите соответствующую функцию в контракте обратного вызова
  • Если вам нужно разместить свой сервис в IIS, то ситуация сложнее, потому что у вас есть возможность размещения вашего сервиса в нескольких процессах, поэтому ваш список может стать фрагментированным (или сорванным в случае перезапуска пула приложений) , В этом случае вам придется использовать что-то внешнее для вашей службы (возможно, MSMQ), чтобы уведомить другие процессы пула приложений о том, что сообщение необходимо отправить.
1 голос
/ 16 ноября 2011

С точки зрения дуплексного соединения, вы действительно можете просто обмениваться данными через одно соединение, а не со всеми соединениями службы, не делая сложную работу с потоками и не закрывая дверь для какой-либо масштабируемости (или используя что-то внеслужба для обработки pub / sub).

Одно из решений, которое может работать намного больше в соответствии с тем, что вы хотите сделать, было бы SignalR .Это позволяет одному клиенту отправлять запрос, а затем вы можете передавать данные этого запроса другим клиентам (или нацеливать его).Посмотрите на его информацию, его единственная цель - это общение в реальном времени в .NET с несколькими клиентами.

Также еще одно замечание, что вы захотите использовать какой-то BackgroundWorker или что-то другое для своей цепочки прослушивания.в WinForms, чтобы пользовательский интерфейс не блокировался во время выполнения фоновых операций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...