我有一个具有net.TCP绑定的WCF双工服务,两个客户端应用程序,即客户端A和客户端B连接。客户端A从某个源获取与时间节拍相关的数据,并通过调用一种方法通知双工服务,该方法通过回调通道向客户端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; }
}
}
}
以下是继承合同接口的服务类的代码:
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)
{
}
}
}
}
}
在上面的代码中,客户端B首先通过调用RegisterClients(String ClientName)方法与Duplex Service建立回调通道。客户端A在每个数据滴答上调用NotifyServer(EventDataType eventData)方法,该方法返回通过回调通道将eventData发送到客户端B. 我的客户端应用程序,客户端A和客户端B都是在C#上开发的,系统工作正常。但是,我希望有一个C ++应用程序来替换客户端A,即我的C ++应用程序正在获取与时间滴答相关的数据,我想通过与C#Client A应用程序相同的过程将数据传递给客户端B. 。 是否有可能在C ++应用程序中使用具有netTCP绑定的WCF服务,并通过WCF服务的客户端对象调用服务的NotifyServer(EventDataType eventData)方法?如果是,请与我分享。
谢谢!
答案 0 :(得分:0)
也许你可以使用WCF创建一个与C#库通信的托管C ++库,而你的本机C ++库将使用这个托管的lib作为代理。 托管C ++库是使用WCF与C#通信C ++库的简便方法。