我已经知道如何创建从桌面应用程序到带回调服务的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>();
}
...
}
有想法吗?
答案 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;
}
}
如果服务使用未注册的回调,则将其存储在队列中以供以后处理,即可解决另一个问题。
我不得不将两个回调对象合并在一起。我希望将它们分开。必须有一个接口定义,以便基类和派生类不起作用。
至少,我的静态回调不会被破坏。