Да, вы можете абсолютно сделать это.
Самый простой способ - реализовать сервис как услугу 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);
}
}
У меня вопрос не возникает. –