多层 WCF 双工通信

Multilayer WCF duplex communication

我有这个问题。我有两个 WCF 服务 - ServiceAServiceB。两种服务都托管在不同的 windows 服务中,并通过 net.tcp 进行通信。客户端访问 Service A。在 Service A 我访问 Service B。我遇到的问题是我想进行双工通信。

也就是我想让客户端在ServiceA中调用方法TestA。此方法将调用 ServiceB 中的方法 TestB。方法 TestB 将执行一些持续时间较长的操作,然后将回调引发回 ServiceA,这将引发对客户端的回调。方法 TestATestB 是单向合同。

我可以到达 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);
    }
}