多层WCF双工通信

时间:2017-03-09 09:40:54

标签: c# wcf message-passing duplex

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

这就是我希望客户在TestA中调用方法ServiceA。此方法将调用TestB中的方法ServiceB。方法TestB会进行一些持续时间很长的操作,然后将回调提升回ServiceA,这会回调客户端。方法TestATestB是单向合同。

communication schema

我可以达到ServiceA将回调引回客户端的程度。然后它在InvalidCastException上崩溃,试图在操作上下文中获取回调通道。

IServiceACallback Callback
    {
        get
        {
            return OperationContext.Current.GetCallbackChannel<IServiceACallback>();
        }
    }

是因为我在一个不同的线程中,操作上下文只是不完整吗?因为当我没有从ServiceB的另一个回调中进行回调时,我可以将回调引回给客户端。我可以解决一些服务属性吗?或者是否有一些我可以使用的沟通模式?

1 个答案:

答案 0 :(得分:0)

好的,我明白了。

通过将回调从ServiceB提升到ServiceA,我处于不同的OperationContext中。这个上下文是完全不同的线程,因此与Client没有任何联系,而是从ServiceB获得了OperationContext的一部分。

我向ServiceA的CallbackHandler添加了指向OperationContext的新成员。为此,我在使用ServiceB创建DuplexChannelfactory期间传递当前上下文。此上下文是正确的,可用于将回调提升回Client。我希望代码能让人理解。

ServiceB中创建ServiceA

InstanceContext context = new InstanceContext(new CallbackHandler(OperationContext.Current));
ChannelFactory<IService> factory = new DuplexChannelFactory<IServiceB>(context, binding, address);
IServiceB service = factory.CreateChannel();

ServiceA的CallbackHandler:

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);
    }
}