【问题标题】:why an object of WCF service contract interface can be casted to IClientChannel为什么可以将 WCF 服务合同接口的对象强制转换为 IClientChannel
【发布时间】:2014-11-22 19:38:47
【问题描述】:

WCF Client Architecture 中,它说

将 ChannelFactory 类与服务契约接口一起使用时,必须强制转换为 IClientChannel 接口才能显式打开、关闭或中止通道

因此,您可以像这样创建和使用客户端通道对象:

var cf = new ChannelFactory<ICalculator>(binding, ea);

var channel = cf.CreateChannel();
double result = channel.Add(5.2, 3.5);
Console.WriteLine(channel.GetType()); // outputs ICalculator
Console.WriteLine(result);

((IClientChannel)channel).Close();

这里有两件事让我感到困惑。

  1. CreateChannel的方法签名,以及第一个标准输出,表明channel变量是ICalculator类型,如何转换成IClientChannel
  2. CreateChannel返回的对象应该是实现了任何接口的某个typeof对象,而channel.GetType()应该返回那个确切的类型,为什么它返回一个接口类型?

【问题讨论】:

    标签: c# wcf channelfactory


    【解决方案1】:

    我最近也在研究同样的事情,因为我试图弄清楚为什么我可以将我的频道转换为 ICommunicationObject,因为我看到了一些 WCF 源代码。

    基本上 .NET 具有运行时所需的类型信息。

    假设我们有一个实现接口的类

    class Foo: IFoo {}
    

    你可以这样声明对象

    IFoo instance = new Foo()
    

    但您也可以将实例直接转换为 Foo()

    Foo cast = (Foo)instance;
    

    因为对象可以在运行时强制转换或转换为其类型。


    那么 WCF 在做什么呢?

    为了好玩,试着用你自己的接口实例化一个通道工厂

    IFoo instance = new ChannelFactory<IFoo>()
    

    你会得到一个运行时异常。

    "无效操作异常 尝试获取 IFoo 的合同类型,但该类型不是 ServiceContract,也不是
    继承一个 ServiceContract。”

    当您使用 [ServiceContract] 属性装饰接口时,WCF 运行时会选择它并构建 WCF 构建频道所需的所有类。

    这包括 ICommunicationObject、IChannelFactory、IClientChannel 等接口。

    因此,尽管工厂方法将您的实例公开为 IFoo,但在运行时它还具有 WCF 需要运行的其他接口。


    最后,channel.GetType() 返回 ICalculatory 的原因是因为 GetType() 正在返回该对象的运行时类型。通过强制转换为 IClientChannel,您正在执行 WCF 保证会成功的类型转换。

    【讨论】:

    • 谢谢,@vid。您对 WCF 如何实现服务合同接口的描述对我有帮助。你能解释为什么 GetType() 返回 ICalculator 吗?还是没搞懂,如果返回引用对象的确切运行时类型,那么应该返回WCF运行时创建的类型的类型信息。
    猜你喜欢
    • 2016-12-04
    • 2014-01-16
    • 1970-01-01
    • 2015-04-11
    • 2022-01-19
    • 2017-11-26
    • 2023-04-01
    • 2023-03-12
    相关资源
    最近更新 更多