example - ¿Cómo puede un Servicio WCF Elevar Eventos a sus Clientes?
wcf vs web api (4)
Quiero saber si hay forma de manejar eventos en WCF. Encontré Callbacks en WCF, pero quiero hacer Event Handling en WCF.
Mi requerimiento es como si quisiera plantear el evento a clientes particulares, no a todos los clientes que utilizan el manejo de eventos en WCF, y también quiero mantener la sesión.
He visto el modelo de editor / suscriptor en WCF que trata sobre la devolución de llamada, pero este modelo se publica a todos los clientes que se han suscrito, pero quiero publicar solo para clientes seleccionados.
Creo que se puede hacer usando Eventos en WCF.
Lado del cliente :
public class Callbacks : IServiceCallback
{
public void CallToMyClient(string name)
{
this.CallToMyClient(name);
}
}
protected void Page_Load(object sender, EventArgs e)
{
Callbacks callback = new Callbacks();
ServiceClient client = new ServiceClient(new InstanceContext(callback));
client.SubscribeClient();
client.DoSomeWork();
}
No hay Evento en WCF para notificar a su cliente, pero hay un canal de devolución de llamada, el propósito del canal de devolución de llamada es el mismo que el evento, aunque el principio de funcionamiento es totalmente diferente en ambos casos. Para notificar a un cliente en particular, lo que puede hacer es almacenar el canal de devolución de llamada de ese cliente mientras se suscribe a alguna parte (prefiero Dictionary en este caso). Más tarde puede elegir la instancia e invocar su método de devolución de llamada sobre ese canal, haciendo que solo un cliente sea notificado.
ACTUALIZAR
Si está interesado aquí está el código:
public interface IClientCallback
{
//Your callback method
[OperationContract(IsOneWay = true)]
void CallToMyClient(string name);
}
[ServiceContract(CallbackContract = typeof(IClientCallback))]
public interface ITestService
{
[OperationContract(IsOneWay = true)]
void SubscribeClient();
[OperationContract(IsOneWay = true)]
void DoSomeWork();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Reentrant)]
public class ServiceImplementation : ITestService
{
private static readonly List<IClientCallback> CallbackChannels = new List<IClientCallback>();
/// <summary>
/// client should call this method before being notified to some event
/// </summary>
public void SubscribeClient()
{
var channel = OperationContext.Current.GetCallbackChannel<IClientCallback>();
if (!CallbackChannels.Contains(channel)) //if CallbackChannels not contain current one.
{
CallbackChannels.Add(channel);
}
}
public void DoSomeWork()
{
//Here write your code to do some actual work
//After you done with your work notify client
//here you are calling only the first client that is registered
IClientCallback callbackChannel = CallbackChannels[0];
callbackChannel.CallToMyClient("You are the only one receving this message");
}
}
No puedes usar eventos. Puede usar devoluciones de llamada para simular eventos.
Si está usando WCF para RPC (como apposed al servicio web o descanso) puede usar .Net Remoting para realizar el proceso cruzado de invocación de evento.
WCF Duple Operation y UI Threads Por jeff.barnes
Quizás esto pueda ayudarte.
WCF no es compatible con el controlador de eventos. El canal de devolución de llamada es el camino para ello