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

时间:2011-04-21 04:27:12

标签: wcf

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

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

我在WCF中看到过处理Callback的发布者/订阅者模型,但是这个模型发布给所有订阅但我只想发布到选定客户端的客户。

我认为可以使用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 个答案:

答案 0 :(得分:68)

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

<强>更新

如果您对此感兴趣,请输入以下代码:

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

答案 1 :(得分:4)

WCF Duple Operation and UI Threads By jeff.barnes

也许这可以帮到你。

WCF不支持事件处理程序。回调频道是它的方式

答案 2 :(得分:1)

您无法使用活动。您可以使用回调来模拟事件。

答案 3 :(得分:1)

如果您使用WCF进行RPC(而不是Web服务或休息),则可以使用.Net Remoting执行事件调用跨进程。

相关问题