2013-03-04 61 views
8

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

  • proxy.MyMethod()被称为

    我的困惑开始,它实际上称为通道的整个链条?

  • 作者使用名为CreateChannel的方法并将其命名为标识符代理。所以在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(); 
    } 
    

回答

3

是的,我想你准确地描述了这一点。 WCF具有这种“频道”的概念, 开发人员倾向于在web.config中配置,而不是编写C#代码。

这些描述在Channel Model Overview

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

从你的最终你作为一个对象进行交互。该框架处理单独渠道的实施 。理解您正在浏览这些图层以便您可以正确配置它们仍然很不错。

10

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

enter image description here

通道的目的是修改消息转换格式,即理解为既 - 客户端和服务器,并组织它的正确输送。传输和协议通道用于此目的。为了使这个过程更容易,我们使用绑定。每个绑定由元素组成,这些元素代表通道堆栈中的某个通道。

因此,每当你打电话给你的方法,它会根据你的DataContract形成消息,并将其传递到整个通道链。每个频道都会修改您的讯息。该prosses看起来像这样

enter image description here

一个WCF代理实际上只是一个抽象的水平。它是一个进程外服务的在线代表。您可以将其想象为一个对象,根据您的绑定元素和dataContract生成并正确配置,这可以让您的客户端和服务器端相互理解。

0

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

代理,在其最一般的形式,一类是功能作为 界面到别的东西。代理可以连接到任何东西:网络连接,内存中的大型对象,文件或其他一些昂贵或不可能复制的资源。

在WCF的情况下的ChannelFactory <> .CreateChannel是基于所述配置创建channel stack。每个通道都为其下面的通道提供抽象。为实例的简化信道堆叠可能是:

  • 通道1个序列化.NET对象到SOAP消息中
  • 通道2增加了安全信息到消息
  • 通道3编码该消息通过TCP发送。

我想你明白这一切。

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

此次讨论的目的是为了回答问题并有意简化。

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

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

Channel是实现代理软件设计模式的架构元素。所有渠道都是代理。在编写客户端代码时,顶级渠道碰巧是最有用的,因为它接受.NET操作合同。