【问题标题】:Is there a way to have multiple callback in DuplexChannelFactory<>?有没有办法在 DuplexChannelFactory<> 中有多个回调?
【发布时间】:2019-08-27 00:56:34
【问题描述】:

我已经知道如何创建从我的桌面应用程序到具有回调的服务的 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>();
    }

    ...
}

想法?

【问题讨论】:

  • 我相信我有一个解决方案,只需要尝试一下。我只需要在 OpenCallback() 方法中传递一个枚举。如果是这样,我将删除这个问题。我只会使用一个界面,我会对其进行个性化设置。敬请期待。

标签: c# wcf ipc


【解决方案1】:

我的解决方案是部分解决方案。向 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;
    }
}

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

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

至少,我的静态回调没有被破坏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多