【问题标题】:Connecting C++ Application to WCF Duplex Service将 C++ 应用程序连接到 WCF 双工服务
【发布时间】:2018-02-12 10:12:09
【问题描述】:

我有一个具有 net.TCP 绑定的 WCF 双工服务,其中两个客户端应用程序,假设客户端 A 和客户端 B 已连接。客户端 A 从某个来源获取有关时间滴答的数据,并通过调用一个方法通知 Duplex Service,该方法反过来通过回调通道向客户端 B 回调一个方法,将该数据传递给客户端 B。

这是我的 WCF 双工服务的合同接口:

namespace BroadcastorService

{

[ServiceContract(CallbackContract = typeof(IBroadcastorCallBack))]
public interface IBroadcastorService
{
    [OperationContract(IsOneWay = true)]
    void RegisterClients(string clientName);
    [OperationContract(IsOneWay = true)]
    void NotifyServer(EventDataType eventData);
}


public interface IBroadcastorCallBack
{
    [OperationContract(IsOneWay = true)]
    void BroadCastToClient(EventDataType eventData);
}

[DataContract]
public class EventDataType
{
    [DataMember]
    public string ClientName { get; set; }
    [DataMember]
    public string Data { get; set; }

    }
}

}

以下是继承合约接口的Service Class的代码:

namespace BroadcastorService
{


[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class BroadcastorService : IBroadcastorService
{
    private static Dictionary<string, IBroadcastorCallBack> clients = new Dictionary<string, IBroadcastorCallBack>();
    private static object locker = new object();

    public void NotifyServer(EventDataType eventData)
    {
        lock(locker)
        {
            var InactiveClients = new List<string>();
            foreach(var client in clients)
            {
                if(client.Key != eventData.ClientName)
                {
                    try
                    {
                        if(client.Key == eventData.symbol)
                        {
                            client.Value.BroadCastToClient(eventData);
                        }

                    }
                    catch
                    {
                        InactiveClients.Add(client.Key);
                    }
                }
            }

            if(InactiveClients.Count > 0)
            {
                foreach(var client in InactiveClients)
                {
                    clients.Remove(client);
                }
            }
        }
    }

    public void RegisterClients(string clientName)
    {
        if(clientName != null && clientName != "")
        {
            try
            {
                IBroadcastorCallBack callback = OperationContext.Current.GetCallbackChannel<IBroadcastorCallBack>();
                lock(locker)
                {
                    if(clients.Keys.Contains(clientName))
                    {
                        clients.Remove(clientName);
                    }
                    clients.Add(clientName, callback);
                }
            }
            catch(Exception ex)
            {

            }
        }
    }
}

}

上述代码中,Client B首先通过调用RegisterClients(String ClientName)方法与Duplex Service建立回调通道。客户端 A 在每个数据滴答上调用 NotifyServer(EventDataType eventData) 方法,然后通过回调通道将 eventData 发送到客户端 B。 我的两个客户端应用程序,客户端 A 和客户端 B 都是在 C# 上开发的,系统运行良好。但是,我想要一个 C++ 应用程序来替换客户端 A,即我的 C++ 应用程序正在获取关于时间刻度的数据,我想通过与 C# 客户端 A 应用程序相同的过程将数据传递给客户端 B . 是否有可能在 C++ 应用程序中使用具有 netTCP 绑定的 WCF 服务并通过 WCF 服务的客户端对象调用服务的 NotifyServer(EventDataType eventData) 方法?如果是,请与我分享。

谢谢!

【问题讨论】:

标签: c# c++ wcf callback duplex


【解决方案1】:

也许您可以创建一个托管 C++ 库,该库使用 WCF 与 C# 库进行通信,并且您的本机 C++ 库将使用此托管库作为代理。 托管 C++ 库是使用 WCF 将 C++ 库与 C# 进行通信的简便方法。

【讨论】:

    猜你喜欢
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多