Ja, das können Sie absolut tun.
Der einfachste Weg besteht darin, Ihren Dienst als PerSession-Dienst zu implementieren und den Rückrufkontext bei der Initialisierung/Konstruktion zu erfassen. Normalerweise füge ich das Dienstobjekt (das an diesem Punkt tatsächlich eine Verbindung darstellt) einem internen Kernobjekt hinzu.
Wenn Sie dann eine Nachricht von einem Client erhalten, können Sie ein beliebiges Serviceobjekt (nicht über den Vertrag) anrufen und die Daten intern an den zugehörigen Client weiterleiten.
Dies ist eine ziemlich minimale Implementierung des Konzepts, ohne Ausnahme Handhabung, und einige ziemlich schlechtes Design (statische Klasse BAD!). Ich habe das nicht getestet, aber die Prinzipien sollten auch dann gelten, wenn ich es versäumt habe, ein i zu kreuzen oder ein t zu punktieren. In diesem Beispiel werden auch die Aufrufe an alle Clients weitergeleitet, aber das Auswählen eines einzelnen Clients folgt demselben Grundmuster.
Der Versuch, dies mit einem Singleton-Dienst zu tun, wird schwieriger sein, und ein per-Call-Service wird natürlich nicht funktionieren :)
[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);
}
}
Ich sehe hier keine Frage. –