Как сервис WCF может инициировать события для своих клиентов? - PullRequest
38 голосов
/ 21 апреля 2011

Я хочу знать, есть ли способ обработки событий в WCF. Я сталкивался с обратными вызовами в WCF, но я хочу сделать обработку событий в WCF.

Мое требование таково, что я хочу поднять событие для определенных клиентов, а не для всех клиентов, использующих обработку событий в WCF, и я также хочу поддерживать сеанс.

Я видел модель издателя / подписчика в WCF, которая имеет дело с обратным вызовом, но эта модель публикуется для всех клиентов, которые подписались, но я хочу публиковать только для выбранных клиентов.

Я думаю, что это можно сделать с помощью Events в WCF.

Клиентская сторона:

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(); 
}

Ответы [ 4 ]

68 голосов
/ 21 апреля 2011

В WCF нет события для уведомления своего клиента, но есть канал обратного вызова, назначение канала обратного вызова такое же, как и событие, хотя принцип работы в обоих случаях полностью различен.Чтобы сообщить конкретному клиенту, что вы можете сделать, это сохранить канал обратного вызова этого клиента при подписке куда-либо (в этом случае я предпочитаю Словарь).Позже вы можете выбрать экземпляр и вызвать метод обратного вызова по этому каналу, при этом уведомление будет получено только одному клиенту.

ОБНОВЛЕНИЕ

Если вы заинтересованывот код:

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");
    }
}
4 голосов
/ 15 марта 2013

Дублирование WCF и потоки пользовательского интерфейса Jeff.barnes

Возможно, это может вам помочь.

WCF не поддерживает обработчик событий.Канал обратного вызова - путь к нему

1 голос
/ 21 февраля 2013

Если вы используете WCF для RPC (в отличие от веб-службы или остальных), вы можете использовать .Net Remoting для выполнения перекрестного процесса вызова события.

1 голос
/ 21 апреля 2011

Вы не можете использовать события.Вы можете использовать обратные вызовы для имитации событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...