多层 WCF 双工通信
Multilayer WCF duplex communication
我有这个问题。我有两个 WCF 服务 - ServiceA
和 ServiceB
。两种服务都托管在不同的 windows 服务中,并通过 net.tcp 进行通信。客户端访问 Service A
。在 Service A
我访问 Service B
。我遇到的问题是我想进行双工通信。
也就是我想让客户端在ServiceA
中调用方法TestA
。此方法将调用 ServiceB
中的方法 TestB
。方法 TestB
将执行一些持续时间较长的操作,然后将回调引发回 ServiceA
,这将引发对客户端的回调。方法 TestA
和 TestB
是单向合同。
我可以到达 ServiceA
将回调返回给客户端的地步。然后它在 InvalidCastException 上崩溃,试图在操作上下文中获取回调通道。
IServiceACallback Callback
{
get
{
return OperationContext.Current.GetCallbackChannel<IServiceACallback>();
}
}
是因为我在不同的线程中,操作上下文只是不完整吗?因为当我不从 ServiceB
的另一个回调中执行回调时,我可以将回调返回给客户端。我可以用一些服务属性来解决它吗?或者有什么我可以使用的通信模式吗?
好的,我明白了。
通过将回调从 ServiceB
提高到 ServiceA
,我处于不同的 OperationContext 中。此上下文在完全不同的线程上,因此与 Client
没有任何联系,而是从 ServiceB
.
获得了 OperationContext 的一部分
我向指向 OperationContext 的 ServiceA
的 CallbackHandler 添加了新成员。为此,我在使用 DuplexChannelfactory
创建 ServiceB
期间传递了当前上下文。此上下文是正确的,可用于将回调引发回 Client
。我希望代码能让它易于理解。
在 ServiceA
中创建 ServiceB
:
InstanceContext context = new InstanceContext(new CallbackHandler(OperationContext.Current));
ChannelFactory<IService> factory = new DuplexChannelFactory<IServiceB>(context, binding, address);
IServiceB service = factory.CreateChannel();
ServiceA
的回调处理程序:
public class CallbackHandler : IServiceBCallback
{
OperationContext _context;
public CallbackHandler(OperationContext context)
{
_context = context;
}
public void TestProgress(string msg)
{
IServiceACallback callback = _context.GetCallbackChannel<IServiceACallback>();
callback.TestProgress(msg);
}
}
我有这个问题。我有两个 WCF 服务 - ServiceA
和 ServiceB
。两种服务都托管在不同的 windows 服务中,并通过 net.tcp 进行通信。客户端访问 Service A
。在 Service A
我访问 Service B
。我遇到的问题是我想进行双工通信。
也就是我想让客户端在ServiceA
中调用方法TestA
。此方法将调用 ServiceB
中的方法 TestB
。方法 TestB
将执行一些持续时间较长的操作,然后将回调引发回 ServiceA
,这将引发对客户端的回调。方法 TestA
和 TestB
是单向合同。
我可以到达 ServiceA
将回调返回给客户端的地步。然后它在 InvalidCastException 上崩溃,试图在操作上下文中获取回调通道。
IServiceACallback Callback
{
get
{
return OperationContext.Current.GetCallbackChannel<IServiceACallback>();
}
}
是因为我在不同的线程中,操作上下文只是不完整吗?因为当我不从 ServiceB
的另一个回调中执行回调时,我可以将回调返回给客户端。我可以用一些服务属性来解决它吗?或者有什么我可以使用的通信模式吗?
好的,我明白了。
通过将回调从 ServiceB
提高到 ServiceA
,我处于不同的 OperationContext 中。此上下文在完全不同的线程上,因此与 Client
没有任何联系,而是从 ServiceB
.
我向指向 OperationContext 的 ServiceA
的 CallbackHandler 添加了新成员。为此,我在使用 DuplexChannelfactory
创建 ServiceB
期间传递了当前上下文。此上下文是正确的,可用于将回调引发回 Client
。我希望代码能让它易于理解。
在 ServiceA
中创建 ServiceB
:
InstanceContext context = new InstanceContext(new CallbackHandler(OperationContext.Current));
ChannelFactory<IService> factory = new DuplexChannelFactory<IServiceB>(context, binding, address);
IServiceB service = factory.CreateChannel();
ServiceA
的回调处理程序:
public class CallbackHandler : IServiceBCallback
{
OperationContext _context;
public CallbackHandler(OperationContext context)
{
_context = context;
}
public void TestProgress(string msg)
{
IServiceACallback callback = _context.GetCallbackChannel<IServiceACallback>();
callback.TestProgress(msg);
}
}