Ответ 1
Вы не можете использовать события. Вы можете использовать обратные вызовы для имитации событий.
Я хочу знать, есть ли способ обработки событий в WCF. Я столкнулся с Callbacks в WCF, но я хочу выполнить обработку событий в WCF.
Мое требование похоже на то, что я хочу поднять событие для конкретных клиентов не всем клиентам, использующим обработку событий в WCF, и также хочу поддерживать сеанс.
Я видел модель Publisher/Subscriber в WCF, которая занимается обратным вызовом, но эта модель публикуется всем подписчикам, но я хочу публиковать их только для выбранных клиентов.
Я думаю, что это можно сделать с помощью событий в 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();
}
Вы не можете использовать события. Вы можете использовать обратные вызовы для имитации событий.
В WCF нет события для уведомления клиента, но есть канал обратного вызова, цель канала обратного вызова такая же, как и событие, хотя принцип работы в обоих случаях совершенно другой. Чтобы сообщить конкретному клиенту, что вы можете сделать, это сохранить канал обратного вызова этого клиента при подписке на него (в этом случае я предпочитаю словарь). Позже вы можете выбрать экземпляр и вызвать метод обратного вызова по этому каналу, так что только один клиент получит уведомление.
UPDATE
Если вас интересует здесь код:
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");
}
}
Работа WCF Duple и потоки пользовательского интерфейса By jeff.barnes
Возможно, это может вам помочь.
WCF не поддерживает обработчик событий. Канал обратного вызова - путь для него
Если вы используете WCF для RPC (например, для веб-службы или для отдыха), вы можете использовать .NET Remoting для выполнения перекрестного процесса вызова события.