WCF服务如何向其客户端提升事件?

use*_*285 38 wcf

我想知道WCF中是否有事件处理方式.我遇到了WCF中的Callbacks,但我想在WCF中进行事件处理.

我的要求就像我想向特定客户端发送事件而不是使用WCF中的事件处理向所有客户端发送事件,我也想维护会话.

我在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(); 
}
Run Code Online (Sandbox Code Playgroud)

cry*_*ted 68

WCF中没有事件通知它的客户端但是有一个回调通道,回调通道的目的与事件相同,尽管两种情况下的工作原理完全不同.要通知特定客户端您可以做的是在订阅某个地方时存储该客户端的回调通道(在这种情况下我更喜欢Dictionary).稍后您可以选择实例并通过该通道调用您的回调方法,这样做只会通知一个客户端.

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");
    }
}
Run Code Online (Sandbox Code Playgroud)


Tha*_* Do 5

WCF 双操作和 UI 线程 作者:jeff.barnes

也许这可以帮助你。

WCF 不支持事件处理程序。回调通道就是它的方法


Joh*_*ers -2

您不能使用事件。您可以使用回调来模拟事件。

  • 事实上,确实如此,而你却非常无助。其他答案提供了代码和具体说明,而您只是提供了居高临下的评论。 (16认同)
  • @约翰:任何链接或代码。 (7认同)