【问题标题】:Confusion about WCF Channels关于 WCF 频道的困惑
【发布时间】:2013-02-18 12:22:00
【问题描述】:

我对代理和频道感到困惑。根据我的阅读,WCF 客户端正在使用通过一系列通道传递消息的代理。每个 Channel 负责特定的任务,例如一个 Channel 对消息进行编码,另一个 Channel 对其进行加密。

当我看到以下代码时,我的困惑开始了

  • proxy.MyMethod()被调用时,它实际上调用了整个通道链?

  • 作者使用了名为CreateChannel的方法,并将标识符命名为proxy。那么在WCF架构中Proxy只是一个空间高层通道,不是一个独立的架构元素吗?

    Binding binding = new NetTcpBinding();  
    EndpointAddress address = new EndpointAddress("net.tcp://localhost:8000");  
    IMyContract proxy = ChannelFactory<IMyContract>.CreateChannel(binding,address);  
    using(proxy as IDisposable)  
    {  
        proxy.MyMethod();  
    }  
    

【问题讨论】:

    标签: wcf channelfactory


    【解决方案1】:

    在 WCF 中,您有 3 个主要组件 - 合同、地址和绑定。通道是一个管道,它是根据这三个部分构建的。

    通道的目的是将消息修改为客户端和服务器都可以理解的格式,并组织它的适当传输。为此使用传输和协议通道。为了使这个过程更容易,我们使用绑定。每个绑定都由元素组成,这些元素代表通道堆栈中的某个通道。

    因此,每次调用方法时,它都会根据您的 DataContract 形成消息,并将其传递给整个通道链。每个频道都会修改您的消息。散文是这样的

    WCF 代理实际上只是一个抽象级别。它是进程外服务的进程内代表。你可以把它想象成一个对象,根据你的绑定元素和你的 dataContract 生成和正确配置,它允许你的客户端和服务器端相互理解。

    【讨论】:

      【解决方案2】:

      是的,我认为您准确地描述了这一点。 WCF 有这个“渠道”的概念, 开发人员倾向于在 web.config 和 不要到处写 C# 代码。

      这些在Channel Model Overview 中有描述。

      当您调用 ChannelFactory.CreateChannel(binding,address); 时,框架会查看您的配置 并为您创建所有这些通道作为一个对象。所以是的,代理就像一堆频道。

      从您的角度来看,您将与它作为一个对象进行交互。框架处理实现 的不同渠道。很高兴了解您正在经历这些层,以便 您可以正确配置它们。

      【讨论】:

        【解决方案3】:

        在这种情况下,“代理”是对软件设计模式的引用。 From Wikipedia

        代理,在其最一般的形式中,是一个作为 接口到别的东西。代理可以连接到任何东西: 网络连接、内存中的大对象、文件或其他 昂贵或无法复制的资源。

        在 WCF 的情况下,ChannelFactory.CreateChannel 正在根据配置创建 channel stack。每个通道都为其下面的通道提供一个抽象。例如,一个简化的通道堆栈可能是:

        • 通道 1 将 .NET 对象序列化为 SOAP 消息
        • 通道 2 将安全信息添加到消息中
        • 通道 3 对要通过 TCP 发送的消息进行编码。

        我想你都明白了。

        回到“代理”的使用:堆栈中的任何通道都是它下面的通道的代理。也就是说,没有渠道是最终目的地。所有渠道都是“与其他事物的接口”。但是,当您向下移动通道堆栈时,不同的通道正在为调用者提供不同的接口/抽象(.NET 对象、SOAP 消息等)。

        同样,此讨论旨在回答问题并有意简化。

        当您编写客户端代码时,最有用的接口是理解 .NET 对象的接口。知道这一点后,ChannelFactory 返回位于堆栈顶部的通道,该通道具有与您的服务合同相匹配的 .NET 接口。将 SOAP 消息创建为字符串,沿着通道堆栈(或创建自定义堆栈),找到接受原始 SOAP 消息的通道,将其标记为“代理”,然后直接调用它是有效的。

        作者使用了名为 CreateChannel 的方法并命名了标识符 代理。所以在 WCF 架构中 Proxy 只是一个特殊的高层 通道,它不是一个独立的架构元素吗?

        Channel 是一个实现代理软件设计模式的架构元素。所有频道都是代理。在编写客户端代码时,顶层通道恰好是最有用的,因为它接受 .NET 操作协定。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-22
          • 2013-05-24
          • 2019-05-17
          • 2020-03-06
          • 2016-03-16
          • 2013-07-27
          • 1970-01-01
          • 2012-09-20
          相关资源
          最近更新 更多