2015-03-09 3 views
2

У меня есть служба Windows, которая непрерывно считывает данные из последовательного порта, из этой службы я хотел бы иметь возможность уведомлять приложение WPF с обновленными данными с помощью WCF; Я думал об использовании обратных вызовов.Как уведомить приложение из службы Windows с помощью WCF

Служба окна будет вызывать метод для сервиса WCF, который в свою очередь назвал бы обратного вызова приложения WPF:

[ServiceContract(CallbackContract = typeof(IUpdateCallback))] 
public interface IMyService 
{ 
    [OperationContract] 
    void Update(UpdatedData data); 
} 

public interface IUpdateCallback 
{ 
    void OnUpdate(UpdatedData data); 
} 

Это, как я планирую реализовать услугу:

public class MyService : IMyService 
{ 
    public void Update(UpdatedData data) 
    { 
     var callback = OperationContext.Current.GetCallbackChannel<IUpdateCallback>(); 

     callback.OnUpdate(data); 
    } 
} 

И затем со стороны клиентского приложения:

public class UpdateCallback : IUpdateCallback 
{ 
    public void OnUpdate(UpdatedData data) 
    { 
     // Update data logic... 
    } 
} 

Я нахожусь на правильном пути или есть бетт r способ сделать это?

ответ

2

Таким образом, использование обратных вызовов, безусловно, является одним из способов сделать это. Тем не менее, канал обратного вызова может отключиться, поэтому вам понадобится способ автоматического повторного подключения. Если вы хотите продолжить движение по этому маршруту, вы выглядите хорошо понимающим.

На мой взгляд, более простым (и, следовательно, превосходным) решением является использование netMsmqBinding, размещение службы в приложении WPF, а затем использование услуг Windows. Это имеет то преимущество, что он более надежный, чем двусторонняя связь, поскольку он полагается на вызовы в один конец и проще реализовать.

Кроме того, служба Windows по-прежнему сможет отправлять уведомления в WPF-приложение, даже если WPF недоступен - сообщения будут просто стоять в очереди до тех пор, пока WPF не вернется в сеть. (Это может быть или не быть желательным.)

На обеих машинах должно быть включено msmq, а для обеспечения максимальной надежности используйте транзакционные очереди с DTC.

если бы я хотел, чтобы иметь возможность передавать данные из клиентского приложения к последовательному порту (службы Windows, будет по-прежнему обрабатывать IO), что я должен реализовать другую службу WCF

В этом случае да, вам нужно настроить службу в службе Windows, которая открыла операцию для WPF для вызова. Это нужно будет определить отдельно для того, которое используется для уведомлений, и может просто использовать http/tcp в качестве транспорта, а не очереди сообщений, поскольку это звучит как синхронная операция.

Должен ли я определять службу WCF внутри проекта WPF, а не как автономной DLL?

Проект WPF является хост-процессом для службы WCF. С этой точки зрения не имеет значения, если вы определите услугу как отдельную сборку или в приложении WPF, вы должны будете развернуть экземпляр ServiceHost в своем приложении WPF, которое откроет службу.

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

как я должен потреблять данные из приложения WPF: служба Windows, будет вызывать службу WCF и отправить данные, отсюда я должен был бы получить, что данные, провести где-то

Так что я понял, что ваш первоначальный план состоял в том, чтобы разместить службу WCF в службе Windows, которая считывает данные из последовательного порта.

Служба WPF будет затем вызывать службу WCF, а служба WCF будет хранить делегат обратного вызова для службы WPF, эффективно, как подписка.

Когда данные поступают на последовательный порт, служба WCF затем вызывает канал обратного вызова и передает данные обратно в службу WPF.

Мое предложение состояло в том, чтобы заменить это на основе очереди, где вы разместили бы службу в WPF-приложении, и чтобы служба Windows просто вызывала службу WCF, когда данные поступали на последовательный порт.

Затем вы спросили о том, чтобы приложение WPF вызывало службу Windows для передачи данных через, и я сказал, что вы должны разместить отдельную службу в службе Windows, чтобы выставить конечную точку для приложения WPF для вызова. Когда приложение WPF совершило вызов и передало данные в службу WCF, эти данные затем могли быть доступны для приложения Windows, которое говорит с последовательным портом.

Вы теперь спрашиваете, как разрешить доступ к сервису Windows для передачи данных, переданных при вызове из приложения WPF, в приложение WCF с сервисом Windows? Если да, то прочитайте мой пост here, в котором подробно описано, как передавать данные из экземпляра службы WCF в домен приложения, который запускает экземпляр ServiceHost.

+0

Спасибо, я проверю это. Также мне было интересно, если бы я захотел отправить данные из клиентского приложения на последовательный порт (служба Windows все равно будет обрабатывать IO), мне придется реализовать еще одну службу WCF (отсюда и обратный вызов), которая обрабатывает общение наоборот? – mainvoid

+0

У меня все еще есть проблемы с выяснением того, как я должен потреблять полученные данные в клиентском приложении? Должен ли я определять службу WCF внутри проекта WPF, а не как отдельную DLL? – mainvoid

+0

@mainvoid см. Мое редактирование на мой ответ. Я не уверен, что вы просите, но я предполагаю, что вы закодировали свой служебный интерфейс и реализацию как отдельную сборку, и теперь вы не знаете, как разместить ее в WPF. Это так? –

0

MSMQ - хороший способ справиться с этим. Если ваш стек технологий разрешает, я бы проверил ActiveMQ или RabbitMQ, так как вы можете сделать истинное паб/субвещание ваших данных другим приложениям, которые были бы заинтересованы в получении этих событий.

Смежные вопросы