【问题标题】:How to notify an application from windows service using WCF如何使用 WCF 从 Windows 服务通知应用程序
【发布时间】:2015-03-09 15:23:10
【问题描述】:

我有一个从串行端口连续读取数据的 Windows 服务,我希望能够通过该服务使用 WCF 向 WPF 应用程序通知更新的数据;我考虑过使用回调。

Windows 服务会调用 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);
    }
}

然后从客户端App端:

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

我是在正确的轨道上,还是有更好的方法来做到这一点?

【问题讨论】:

    标签: c# wcf windows-services ipc


    【解决方案1】:

    所以使用回调当然是一种方法。但是,回调通道可能会超时,因此您需要一种自动重新连接的方法。如果您想继续沿着这条路线走下去,那么您在理解方面看起来不错。

    在我看来,更简单(因此更优越)的解决方案是使用netMsmqBinding,将服务托管在 WPF 应用程序中,然后让 Windows 服务使用它。这样做的好处是它比双工通信更可靠,因为它依赖于单向调用,并且更易于实现。

    此外,即使 WPF 不可用,Windows 服务仍然能够向 WPF 应用程序发送通知 - 消息只会排队等待 WPF 重新联机。 (这可能是可取的,也可能是不可取的。)

    您需要在两台机器上启用msmq,并且为了获得最大可靠性,请使用带有DTC 的事务队列。

    如果我希望能够将数据从客户端应用程序发送到串行 端口(Windows 服务仍将处理 IO),我是否必须 实现另一个 WCF 服务

    在这种情况下,是的,您必须在 Windows 服务上配置一个服务,该服务公开了一个供 WPF 调用的操作。这需要与用于通知的定义分开定义,并且可以只使用 http/tcp 作为传输而不是消息队列,因为这听起来像一个同步操作。

    我应该在 WPF 项目中定义 WCF 服务而不是作为 独立DLL?

    WPF 项目是 WCF 服务的宿主进程。从这个角度来看,如果您将服务定义为独立程序集或在 WPF 应用程序中,则没有区别,您应该能够在您的 WPF 应用程序中启动一个ServiceHost 实例,该实例将公开该服务。

    尽管您将服务代码定义为服务的运行时托管几乎没有什么不同,但作为最佳实践,我总是尝试将您的实际服务实现定义为一个单独的程序集,以将逻辑上不同的东西保留在一个不同的地方。

    我应该如何使用来自 WPF 应用程序的数据: Windows 服务将从这里调用 WCF 服务并发送数据 我需要检索保存在某处的数据

    所以我的理解是,您最初的计划是在从串行端口读取数据的 Windows 服务中托管 WCF 服务

    然后 WPF 服务将调用 WCF 服务,而 WCF 服务将存储 WPF 服务的回调委托,就像订阅一样有效。

    当数据到达串行端口时,WCF 服务将调用回调通道并将数据反馈给 WPF 服务。

    我的建议是将其替换为基于队列的方法,您将在 WPF 应用程序中托管服务,并让 Windows 服务在数据到达串行端口时简单地调用 WCF 服务。

    然后您询问是否让 WPF 应用程序调用 Windows 服务来传递数据,我说您应该在 Windows 服务中托管一个单独的服务,以便公开一个端点供 WPF 应用程序调用。当 WPF 应用程序进行调用并将数据传递到 WCF 服务时,这些数据可以提供给与串行端口对话的 Windows 应用程序。

    您现在是否在询问如何允许在从 WPF 应用程序到 Windows 服务托管的 WCF 应用程序的调用中传递的数据可供 Windows 服务使用?如果是这样,请阅读我的帖子here,其中详细介绍了如何将数据从 WCF 服务实例传递到运行 ServiceHost 实例的应用程序域。

    【讨论】:

    • 谢谢,我去看看。我还想知道,如果我希望能够将数据从客户端应用程序发送到串行端口(Windows 服务仍将处理 IO),我是否必须实现另一个 WCF 服务(因此另一个回调)来处理通信反过来呢?
    • 我仍然无法弄清楚的一件事是我应该如何使用客户端应用程序中收到的数据?我应该在 WPF 项目中定义 WCF 服务而不是作为独立的 DLL 吗?
    • @mainvoid 查看我对答案的编辑。我不确定您要问什么,但我假设您已将服务接口和实现编码为单独的程序集,现在您不确定如何在 WPF 中托管它。是这样吗?
    • @Learning 如果您将评论作为问题发布,准确概述您想要实现的目标,以及您对解决方案的任何想法,然后将链接作为评论粘贴到此处,我会采取看看。
    • @Learning 这是一个复杂的要求——超出了我目前的知识范围。我已经对问题进行了格式化,以便更容易理解。我希望你能得到一些好的回应!祝你的解决方案好运
    【解决方案2】:

    MSMQ 是处理此问题的好方法。如果您的技术堆栈允许,我会检查 ActiveMQ 或 RabbitMQ,因为您可以将您的数据真正发布/订阅广播到其他有兴趣接收这些事件的应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多