我看到WCF没有直接使用事件而是使用OneWay委托调用,但是有人可以告诉我一个关于如何执行此操作的简单示例吗?
以下是我现在设置的内容:
[OperationContract(IsOneWay = true)]
void OnGetMapStoryboardsComplete(object sender, List<Storyboard> results);
答案 0 :(得分:7)
假设您的回调合约接口名为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
,其中包含对将处理事件的对象的引用:
EventHandler eventHandler = new EventHandler();
MyServiceClient client = new MyServiceClient(new InstanceContext(eventHandler));
这有意义吗?