我有这个问题。我有两个WCF服务 - ServiceA
和ServiceB
。两种服务都托管在不同的Windows服务中,并通过net.tcp进行通信。客户访问Service A
。在Service A
我访问Service B
。我得到的问题是我希望通信是双工的。
这就是我希望客户在TestA
中调用方法ServiceA
。此方法将调用TestB
中的方法ServiceB
。方法TestB
会进行一些持续时间很长的操作,然后将回调提升回ServiceA
,这会回调客户端。方法TestA
和TestB
是单向合同。
我可以达到ServiceA
将回调引回客户端的程度。然后它在InvalidCastException上崩溃,试图在操作上下文中获取回调通道。
IServiceACallback Callback
{
get
{
return OperationContext.Current.GetCallbackChannel<IServiceACallback>();
}
}
是因为我在一个不同的线程中,操作上下文只是不完整吗?因为当我没有从ServiceB
的另一个回调中进行回调时,我可以将回调引回给客户端。我可以解决一些服务属性吗?或者是否有一些我可以使用的沟通模式?
答案 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);
}
}