Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法在DuplexChannelFactory中进行多次回调<>;?_C#_Wcf_Ipc - Fatal编程技术网

C# 有没有办法在DuplexChannelFactory中进行多次回调<>;?

C# 有没有办法在DuplexChannelFactory中进行多次回调<>;?,c#,wcf,ipc,C#,Wcf,Ipc,我已经知道如何创建从桌面应用程序到带有回调的服务的WCF双工通道。我扩展了服务接口并创建了两个回调接口。我还想将我的系统托盘小程序连接到该服务 有没有一种方法可以同时进行两次回调 应用程序不关心托盘回调,只关心它自己的回调,而托盘小程序只关心托盘,而不关心应用程序 由于两个应用程序都注册了回调,因此一个应用程序与另一个应用程序重叠,存储在服务端的静态变量中。这会导致悲伤,更不用说不恰当的方法了 // In the tray // var callbackTray = new IpcAppToSe

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

    ...
}
//在托盘中
//
var callbackTray=new-IpcAppToServiceBackTray();
InstanceContext callbackInstanceTray=新InstanceContext(callbackTray);
var callbackApp=new-IpcAppToServiceBackApp();
InstanceContext callbackInstanceApp=新InstanceContext(callbackApp);
NetNamedPipeBinding ipcBinding=新NetNamedPipeBinding()
{
Security=new NetNamedPipeSecurity(){Mode=NetNamedPipeSecurityMode.None},
};
EndpointAddress EndpointAddress=新的EndpointAddress(“网络地址”)。pipe://localhost/ResqIpcAppToService");
ComAppToService.IpcFactory=新的DuplexChannelFactory(callbackInstanceTray、ipcBinding、endpointAddress);
Program.HostIpcAppToService=ComAppToService.IpcFactory.CreateChannel();
Program.HostIpcAppToService.OpenCallbackTray();
...
//在职
//
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall,IncludeExceptionDetailInFaults=true)]
公共类IpcAppToService:IIpcAppToService,IErrorHandler
{
公共静态IIpcAppToServiceBackApp CallbackApp{get;private set;}=null;
public void OpenCallbackApp()
{
IpcAppToService.CallbackApp=OperationContext.Current.GetCallbackChannel();
}
公共静态IIpcAppToServiceBackTray CallbackTray{get;private set;}=null;
public void OpenCallbackTray()
{
IpcAppToService.CallbackTray=OperationContext.Current.GetCallbackChannel();
}
...
}

想法?

我的解决方案是部分解决方案。将枚举添加到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;
    }
}
//接口定义
[运营合同(IsOneWay=false)]
[FaultContractAttribute(类型(IpcToTrayFault))]
void OpenCallback(IpcCallbackDest callbackDest);
//在职
//
公共静态IIPCAppToService回调应用程序{get;private set;}=null;
公共静态IIPCAppToService回调托盘{get;private set;}=null;
公共void OpenCallback(IpcCallbackDest callbackDest)
{
交换机(callbackDest)
{
案例IpcCallbackDest.App:
IpcAppToService.CallbackApp=OperationContext.Current.GetCallbackChannel();
打破
案例IpcCallbackDest.托盘:
IpcAppToService.CallbackTray=OperationContext.Current.GetCallbackChannel();
打破
违约:
打破
}
}
如果服务使用未注册的回调,则将其存储在队列中以供稍后处理,解决另一个问题

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


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

我相信我有一个解决方案,只要尝试一下就可以了。我只需要在OpenCallback()方法中传递一个枚举。如果是,我会删除这项质询。我只会使用一个界面,我会个性化。敬请期待。