【问题标题】:How are events declared in an interface exposed in a WCF client proxy?如何在 WCF 客户端代理中公开的接口中声明事件?
【发布时间】:2013-06-21 14:55:00
【问题描述】:

我有以下场景:

  • 服务合同的一个接口 (IInterface)
  • 接口内声明的事件(我稍后会解释目的)
  • 实现此接口的一个类,服务类 (MyClass)
  • 使用接口契约打开通道并获取代理类的客户端,该类公开所有实例的成员,包括事件。

当我创建我的服务类的实例时:

IInterface instance = (IInterface)new MyClass();

从那里,我可以做到:

instance.Event1 += OnEvent1;

但是当我创建代理客户端时:

IInterface proxy = new ChannelFactory<IInterface>(....);

Event1 是如何暴露在代理客户端的? 它们只是代理端的事件,对吗? 它们与服务器类完全断开连接,对吧?

所以,我可以这样做:

proxy.Event1 += OnEvent1;

但是Event1 永远不会从 WCF 服务器类实例中调用,对吗?

如果 WCF 服务器类执行以下事件检查会发生什么:

if (Event1 != null)
  { Event1(); }

...什么都没发生?

【问题讨论】:

    标签: c# .net wcf events


    【解决方案1】:

    C# 事件是一个 C# 构造。它绑定到 C# 语言。 WCF 不会在其端点上公开此类构造。

    如果IInterface 是您的服务合同并且有一个 C# 事件。此事件在客户端代理生成的IInterface 上不可见/不创建。

    WCF 使用回调合约来实现事件。

    【讨论】:

    • 虽然要点是正确的,但事件是一个 .NET 概念,而不是纯粹的 C#。
    • 好吧,实际上,我的 IInterface(合同)的事件在代理类的客户端中得到了很好的公开。我可以绑定它们。
    • @user810917:这意味着您还没有从 add service referencesvcutil 在客户端生成合约接口。您必须复制粘贴接口定义或从客户端引用相同的程序集来定义服务器上的接口。
    • 是的,我没有生成代理类。我正在通过代码创建通道: IInterface proxy = new ChannelFactory(....);然后,在我的代理类中,事件可用并且我可以绑定到它们。当然,什么都不会发生,因为触发事件的代码不存在于这个代理类中。但在我的场景中,代理类被其他一些类包裹,这些类实际上可以复制服务器端的行为并触发事件。无论如何,现在对我来说很清楚。无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多