Да, вы можете это сделать.
Самый простой способ - реализовать свой сервис как сервис PerSession и захватить контекст обратного вызова при инициализации / создании. Обычно я добавляю объект службы (который на самом деле представляет соединение в этой точке) к внутреннему базовому объекту.
Затем, когда вы получаете сообщение от клиента, вы можете позвонить любому из сервисных объектов (не по контракту) и внутренне перенаправить данные на связанный клиент.
Это довольно минимальная реализация концепции без обработки исключений и довольно плохой дизайн (статический класс BAD!). Я не проверял это, но принципы должны сохраняться, даже если я пропустил пересечение i или расставление точек t. В этом примере также перенаправляются вызовы всем клиентам, но выбор отдельного клиента происходит по той же базовой схеме.
Попытка сделать это с помощью одноэлементной службы будет более трудной, и служба для каждого вызова, очевидно, не будет работать:)
[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);
}
}