WCF服务如何向其客户端引发事件?

WCF服务如何向其客户端引发事件?,wcf,Wcf,我想知道在WCF中是否有事件处理的方法。 我在WCF中遇到回调,但我想在WCF中处理事件 我的要求是,我希望将事件提交给特定的客户机,而不是所有在WCF中使用事件处理的客户机,并且我还希望维护会话 我在WCF中见过处理回调的Publisher/Subscriber模型,但该模型发布到所有已订阅的客户端,但我只想发布到选定的客户端 我认为这可以通过使用WCF中的事件来实现 客户端: public class Callbacks : IServiceCallback { public voi

我想知道在WCF中是否有事件处理的方法。 我在WCF中遇到回调,但我想在WCF中处理事件

我的要求是,我希望将事件提交给特定的客户机,而不是所有在WCF中使用事件处理的客户机,并且我还希望维护会话

我在WCF中见过处理回调的Publisher/Subscriber模型,但该模型发布到所有已订阅的客户端,但我只想发布到选定的客户端

我认为这可以通过使用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中没有通知其客户端的事件,但有一个回调通道,回调通道的用途与事件相同,尽管两种情况下的工作原理完全不同。 要通知一个特定的客户机,您可以在订阅某处时存储该客户机的回调通道(在本例中,我更喜欢字典)。稍后,您可以选择实例并通过该通道调用回调方法,这样做只会通知一个客户机

更新

如果您感兴趣,请参阅以下代码:

公共接口IClientCallback
{
//您的回调方法
[运营合同(IsOneWay=true)]
void CallToMyClient(字符串名称);
}
[ServiceContract(CallbackContract=typeof(IClientCallback))]
公共接口ITestService
{
[运营合同(IsOneWay=true)]
无效订阅客户端();
[运营合同(IsOneWay=true)]
无效DoSomeWork();
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall,ConcurrencyMode=ConcurrencyMode.Reentrant)]
公共类服务实现:ITestService
{
私有静态只读列表回调通道=新列表();
/// 
///客户端应在收到某个事件的通知之前调用此方法
/// 
公共无效订阅客户端()
{
var channel=OperationContext.Current.GetCallbackChannel();
if(!CallbackChannels.Contains(channel))//如果CallbackChannels不包含当前通道。
{
CallbackChannels.Add(频道);
}
}
公共工程
{
//在这里编写代码来完成一些实际工作
//完成工作后,通知客户
//这里您只调用第一个注册的客户端
iclientcallbackcallbackchannel=CallbackChannels[0];
callbackChannel.CallToMyClient(“您是唯一收到此消息的人”);
}
}

如果您将WCF用于RPC(与web服务或rest类似),则可以使用它跨进程执行事件调用。

也许这能帮助你


WCF不支持事件处理程序。回调通道是实现我在帖子中提到的要求的途径。@John:任何链接或代码都可以。事实上,是这样,而你却毫无帮助。其他答案为他们的答案提供了代码和具体说明,而您只是提供了屈尊的评论。感谢您的服务代码。我在上面发布了客户端代码,请看一看,但我无法引发事件。我喜欢这个答案。真是太棒了。包含客户端代码示例。John.net远程处理未被弃用。它的遗产和仍然有价值的用例,特别是如果RPC事件调用是一项要求的话!请在否决投票前进行自我教育:请注意微软技术负责人自己关于该框架的话:“远程处理是.Net框架的一部分,因此它不会消失……对于进程中,跨appdomain通信远程处理是CLR固有的通信方式。未命名的“微软技术负责人”的话“,在某个未指定的日期,请不要改变这样一个事实:对于几乎所有的需求,WCF都是.NET远程处理的替代品。即使在OP的请求方面,也不需要事件,而是通知。WCF回调契约实现了这一点,而无需诉诸远程处理。顺便说一句,我说的是“弃用的”,而不是“过时的”。名字是克莱门斯·瓦瑟斯,请阅读链接中的答案。我熟悉瓦瑟斯先生。评论的日期是什么时候?你有链接吗?这是一个有趣的例子,很容易构建和运行(只要你记得以管理员身份运行BeerService)。我使用升级向导将其加载到VS2010中(没有问题)。
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");
    }
}