Соединение приложения C ++ с дуплексной службой WCF

У меня есть дуплексный сервис WCF, имеющий привязку net.TCP, с которой связаны два клиентских приложения, скажем, клиент 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). Клиент A вызывает метод NotifyServer (EventDataType eventData) на каждом тике данных, который в свою очередь отправляет eventData клиенту B через канал обратного вызова.
Оба моих клиентских приложения, Client A и Client B, разработаны на C #, и система работает отлично. Тем не менее, я хотел бы иметь приложение C ++ для замены клиента A, т.е. мое приложение C ++ получает данные относительно временного тика, и я хотел бы передать данные клиенту B тем же процессом, что и в приложении C # клиента A ,
Есть ли возможность использования службы WCF, имеющей привязку netTCP, в приложении C ++ и вызова метода NotifyServer (EventDataType eventData) службы через объект клиента службы WCF? Если да, то, пожалуйста, поделитесь этим со мной.

Спасибо!

0

Решение

Возможно, вы можете создать управляемую библиотеку C ++, которая взаимодействует с библиотекой C # с помощью WCF, и ваша нативная библиотека C ++ будет использовать эту управляемую библиотеку в качестве прокси.
Управляемая библиотека C ++ — это простой способ связи библиотеки C ++ с C # с использованием WCF.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector