【问题标题】:Multilayer WCF duplex communication多层 WCF 双工通信
【发布时间】:2017-03-09 09:40:53
【问题描述】:

我有这个问题。我有两个 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 的另一个回调中执行回调时,我可以将回调返回给客户端。我可以用一些服务属性解决它吗?或者有什么我可以使用的交流模式?

【问题讨论】:

  • 架构应该可以工作。当您收到部分消息时,通常会发生像您这样的异常。确保接收代码清楚地知道每条消息的结尾。尝试读取的数据多于输入缓冲区中存在的数据将导致下溢并产生异常。
  • 你的意思是invalidCastException吗?
  • 是的,它是 InvalidCastException
  • 一定和 OperationContext 生命周期有关

标签: c# wcf message-passing duplex


【解决方案1】:

好的,我想通了。

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

我向 ServiceA 的 CallbackHandler 添加了指向 OperationContext 的新成员。为此,我在创建ServiceB 期间使用DuplexChannelfactory 传递当前上下文。此上下文是正确的上下文,可用于将回调引发回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的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);
    }
}

【讨论】:

    猜你喜欢
    • 2011-03-23
    • 2012-03-25
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多