【发布时间】: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() 方法中传递一个枚举。如果是这样,我将删除这个问题。我只会使用一个界面,我会对其进行个性化设置。敬请期待。