WCF活动宣言

Eri*_*ood 3 wcf

我看到WCF不直接使用事件而是使用OneWay委托调用,但是有人可以告诉我一个关于如何执行此操作的简单示例吗?

这是我现在设置的内容:

    [OperationContract(IsOneWay = true)]
    void OnGetMapStoryboardsComplete(object sender, List<Storyboard> results);
Run Code Online (Sandbox Code Playgroud)

Mal*_*olm 7

假设您的回调契约接口被调用IMyServiceCallback,您的服务将在它想要引发事件时执行以下代码:

IMyServiceCallback callback = OperationContext.Current.GetCallbackChannel<IMyServiceCallback>();
callback.OnGetMapStoryboardsComplete(...);
Run Code Online (Sandbox Code Playgroud)

我发现这篇文章非常有帮助.它描述了一个瞬态事件系统和一个持久化事件系统,其中任何一个都应该满足任何和所有事件场景,IMO.

HTH

要设置回调合同:

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

然后,您需要在服务合同上指明它正在使用此回调:

[ServiceContract(CallbackContract = typeof(IMyServiceCallback))]
interface IMyService
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

EventHandler eventHandler = new EventHandler();
MyServiceClient client = new MyServiceClient(new InstanceContext(eventHandler));
Run Code Online (Sandbox Code Playgroud)

那有意义吗?