有没有办法在DuplexChannelFactory <>中有多个回调?

时间:2019-08-27 00:56:34

标签: c# wcf ipc

我已经知道如何创建从桌面应用程序到带回调服务的WCF双工通道。我扩充了服务接口并创建了两个回调接口。我还想将系统托盘小程序连接到该服务。

是否可以同时拥有两个回调?

应用程序将仅关心托盘回调,而不会关心托盘回调,而托盘小应用程序将仅关心托盘而不是应用程序。

由于两个应用程序都注册了该回调,所以它们重叠在一起,就像存储在服务端的静态变量中一样。这引起了悲伤,更不用说不合适的方法了。

// In the tray
//
var callbackTray = new IpcAppToServiceBackTray();
InstanceContext callbackInstanceTray = new InstanceContext(callbackTray);

var callbackApp = new IpcAppToServiceBackApp();
InstanceContext callbackInstanceApp = new InstanceContext(callbackApp);

NetNamedPipeBinding ipcBinding = new NetNamedPipeBinding()
{
    Security = new NetNamedPipeSecurity() { Mode = NetNamedPipeSecurityMode.None },
};

EndpointAddress endpointAddress = new EndpointAddress("net.pipe://localhost/ResqIpcAppToService");

ComAppToService.IpcFactory = new DuplexChannelFactory<IIpcAppToService>(callbackInstanceTray, ipcBinding, endpointAddress);

Program.HostIpcAppToService = ComAppToService.IpcFactory.CreateChannel();
Program.HostIpcAppToService.OpenCallbackTray();
...


// In the service
//
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, IncludeExceptionDetailInFaults = true)]
public class IpcAppToService : IIpcAppToService, IErrorHandler
{
    public static IIpcAppToServiceBackApp CallbackApp { get; private set; } = null;

    public void OpenCallbackApp()
    {
        IpcAppToService.CallbackApp = OperationContext.Current.GetCallbackChannel<IIpcAppToServiceBackApp>();
    }

    public static IIpcAppToServiceBackTray CallbackTray { get; private set; } = null;

    public void OpenCallbackTray()
    {
        IpcAppToService.CallbackTray = OperationContext.Current.GetCallbackChannel<IIpcAppToServiceBackTray>();
    }

    ...
}

有想法吗?

1 个答案:

答案 0 :(得分:0)

我的解决方案是部分解决方案。向OpenCallback添加枚举解决了一个问题。

// Interface Definition
[OperationContract(IsOneWay = false)]
[FaultContractAttribute(typeof(IpcToTrayFault))]
void OpenCallback(IpcCallbackDest callbackDest);

// In Service
//
public static IIpcAppToServiceBack CallbackApp { get; private set; } = null;
public static IIpcAppToServiceBack CallbackTray { get; private set; } = null;

public void OpenCallback(IpcCallbackDest callbackDest)
{
    switch (callbackDest)
    {
        case IpcCallbackDest.App:
            IpcAppToService.CallbackApp = OperationContext.Current.GetCallbackChannel<IIpcAppToServiceBack>();
            break;
        case IpcCallbackDest.Tray:
            IpcAppToService.CallbackTray = OperationContext.Current.GetCallbackChannel<IIpcAppToServiceBack>();
            break;
        default:
            break;
    }
}

如果服务使用未注册的回调,则将其存储在队列中以供以后处理,即可解决另一个问题。

我不得不将两个回调对象合并在一起。我希望将它们分开。必须有一个接口定义,以便基类和派生类不起作用。

至少,我的静态回调不会被破坏。