【问题标题】:WCF Event DeclarationWCF 事件声明
【发布时间】:2009-07-17 14:48:46
【问题描述】:

我看到 WCF 不直接使用事件,而是使用 OneWay 委托调用,但是有人可以给我一个简单的例子来说明如何做到这一点吗?

这是我现在设置的:

    [OperationContract(IsOneWay = true)]
    void OnGetMapStoryboardsComplete(object sender, List<Storyboard> results);

【问题讨论】:

    标签: wcf


    【解决方案1】:

    假设你的回调合约接口被称为IMyServiceCallback,当你的服务想要引发事件时,它会执行以下代码:

    IMyServiceCallback callback = OperationContext.Current.GetCallbackChannel<IMyServiceCallback>();
    callback.OnGetMapStoryboardsComplete(...);
    

    我发现this article 很有帮助。它描述了一个瞬态事件系统和一个持久事件系统,其中任何一个都应该满足任何和所有事件场景,IMO。

    HTH

    设置回调合约:

    interface IMyServiceCallback
    {
        [OperationContract(IsOneWay = true)]
        void OnGetMapStoryboardsComplete(object sender, List<Storyboard>);
    }
    

    那么你需要在你的服务合约上指明它正在使用这个回调:

    [ServiceContract(CallbackContract = typeof(IMyServiceCallback))]
    interface IMyService
    {
        // ...
    }
    

    完成此操作并实施服务后,请创建对该服务的引用。然后客户端必须包含一个实现IMyServiceCallback的类:

    class EventHandler : IMyServiceCallback
    {
        public void OnGetMapStoryBoardsComplete(object sender, List<Storyboard>)
        {
            // Do whatever needs to be done when the event is raised.
        }
    }
    

    当您从客户端连接到服务时,您需要向它传递一个 InstanceContext,该 InstanceContext 是使用对将处理事件的对象的引用构建的:

    EventHandler eventHandler = new EventHandler();
    MyServiceClient client = new MyServiceClient(new InstanceContext(eventHandler));
    

    这有意义吗?

    【讨论】:

    • 我认为我没有回调合约,我该如何设置?
    • 这是否回答了您的问题,还是您仍有问题?
    • MyServiceClient 客户端 = new MyServiceClient(new InstanceContext(eventHandler));
    猜你喜欢
    • 2018-04-23
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多