首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以使用WCF双工绑定来中继消息吗?

我可以使用WCF双工绑定来中继消息吗?
EN

Stack Overflow用户
提问于 2009-08-04 12:10:02
回答 4查看 2.7K关注 0票数 1

我有一个客户端应用程序,一个服务器和另一个客户端,让我们称之为第三方。我有一个回调接口,作为我的契约的一部分,由第三方和客户端实现。

第三方将调用服务器操作(方法),然后服务器将触发回调,但它将调用客户端的回调实现,而不是调用第三方的回调。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-06 10:10:57

我想我找到解决方案了..

这是链接。http://msdn.microsoft.com/en-us/magazine/cc163537.aspx

试着看看图6,这就是我想要实现的。

票数 0
EN

Stack Overflow用户

发布于 2009-08-05 05:00:36

是的,你完全可以做到。

最简单的方法是将您的服务实现为PerSession服务,并在初始化/构造时捕获回调上下文。通常,我会将服务对象(在这一点上真正表示连接)添加到内部核心对象。

然后,当您收到来自客户端的消息时,您可以调用任何服务对象(而不是通过约定),并在内部将数据转发到关联的客户端。

这是一个非常小的概念实现,没有异常处理,以及一些非常糟糕的设计(静态类糟糕!)。我还没有测试过这一点,但即使我错过了跨越i或点t,这些原则也应该有效。这个示例也将调用转发到所有客户端,但选择单个客户端遵循相同的基本模式。

尝试使用单例服务来实现这一点将会更加困难,而且每次调用的服务显然不会起作用:)

代码语言:javascript
运行
复制
[ServiceContract(CallbackContract = typeof(ICallback))]
public interface IContract
{
    [OperationContract(IsOneWay = true)]
    void SendTheData(string s);
}

public interface ICallback
{
    [OperationContract(IsOneWay = true)]
    void ForwardTheData(string s);
}

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, InstanceContextMode = InstanceContextMode.PerSession)]
public class ServiceConnection : IContract
{
    private ICallback m_callback;

    public ServiceConnection()
    {
        m_callback = OperationContext.Current.GetCallbackChannel<ICallback>();
        ServiceCore.Add(this);
    }

    public void SendTheData(string s)
    {
        ServiceCore.DataArrived(s);
    }

    public void SendToClient(string s)
    {
        m_callback.ForwardTheData(s);
    }
}

static public class ServiceCore
{
    static private List<ServiceConnection> m_connections = new List<ServiceConnection>();


    public static void DataArrived(string s)
    {
        foreach(ServiceConnection conn in m_connections)
        {
            conn.SendTheData(s);
        }
    }

    public static void Add(ServiceConnection connection)
    {
        m_connections.Add(connection);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2009-08-04 12:19:15

快速阅读Microsoft Duplex服务文档后,我认为它不会做您想要的事情。可能还有其他一些聪明的功夫WCF方法可以做到这一点,但在我的例子中,我为服务器创建了一个"PassThruService“,它实现了与真实服务相同的契约,并将任何接收到的请求发送到客户端。

这是我的代码的一部分,解释了它的主旨。

代码语言:javascript
运行
复制
private const int OPERATION_TIMEOUT = 5000;
private MyServiceClient m_client = new MyServiceClient();

public bool IsAlive() {
    try {
        logger.Debug("PassThruService IsAlive.");

        bool isAlive = false;
        ManualResetEvent isAliveMRE = new ManualResetEvent(false);

        m_client.IsAliveComplete += (s, a) => { isAlive = a.Result; isAliveMRE.Set(); };
        m_client.IsAliveAsync();

        if (isAliveMRE.WaitOne(OPERATION_TIMEOUT)) {
            return isAlive;
        }
        else {
            throw new TimeoutException();
        }
    }
    catch (Exception excp) {
        logger.Error("Exception PassThruService IsAlive. " + excp.Message);
        throw;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1227124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档