【问题标题】:Windows Service hosted WCF: Callback to client from Windows serviceWindows 服务托管的 WCF:从 Windows 服务回调到客户端
【发布时间】:2016-09-30 23:03:20
【问题描述】:

我获得了由 Windows 服务托管的 wcf 服务。 Windows 服务侦听 USB 驱动器(移除和插入。 现在我想通知客户。

我尝试先从 windows 服务调用 wcf 服务中的静态方法 然后我通过

调用回调方法
OperationContext.Current.GetCallbackChannel<ICallback>() 

但 OperationContext.Current 始终为空。似乎我在错误的线程/上下文中。

然后尝试在 wcf 服务中声明一个静态事件,在 wcf 中注册它并从 wcf 服务中的 windows 服务调用一个静态方法,然后触发该事件:

//WCF Service
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class WCFService : IService
{

    public static event EventHandler<EventArgs> StatusChanged;

    public Service()
    {
        StatusChanged += OnStatusChanged;
    }

    private void OnStatusChanged(object sender, EventArgs eventArgs)
    {
        // still not in the correct thread here?
        // OperationContext.Current is null

        OperationContext.Current.GetCallbackChannel<ILocalLicenceBackendServiceCallback>().ServiceStateChanged();
    }

    public static void ChangeStatus()
    {
        if (StatusChanged != null)
            StatusChanged(null,EventArgs.Empty);
    }
}


//Windows Service
public partial class WindowsService : ServiceBase
{


    private void OnStatusChanged()
    {
        WCFService.ChangeStatus();
    }

}

..仍然无法正常工作。那么我该如何做到这一点,通过 wcf 回调将信息从 Windows 服务传递到客户端。

【问题讨论】:

  • 您只能在服务操作内部进行回调,该服务操作最初是对您的服务的客户端调用(OperationContext.Current 仅在服务操作内部不为空)。您的 OnStatusChanged 事件处理程序不会在 WCF 服务操作的上下文中执行。您是否已经研究过关于 SO 的其他“发布订阅 wcf”文章?那里有很多信息。

标签: c# wcf callback windows-services


【解决方案1】:

好的,我现在所做的是从客户端调用“InitCallback”函数并将 ICallBack 对象保存到字段中。 重用来自 windows 服务的回调对象,以便能够通过 wcf 服务从 windows 服务与客户端进行通信。

为此,wcf 服务当然必须以单例方式运行。可扩展性不是问题..所以我很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2012-04-28
    相关资源
    最近更新 更多