WCF通道的困惑

8

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

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

  • When proxy.MyMethod() is called, it actually called the whole chain of channels?

  • The author used method called CreateChannel and named the identifier proxy. So in WCF architecture Proxy is just a spacial high level channel, it is not a stand alone architecture element?

    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个回答

12
在WCF中,你有三个主要组件 - 契约、地址和绑定。通道是一个管道,根据这三个部分构建。

enter image description here

该频道的目的是将消息修改为客户端和服务器都能理解的格式,并组织其适当的传输。为此,使用传输和协议通道。为了使这个过程更容易,我们使用绑定。每个绑定由元素组成,这些元素代表通道堆栈中的某些通道。
因此,每次调用方法时,它会根据您的DataContract形成消息,并将其通过整个通道链传递。每个通道都会修改您的消息。该过程如下所示。

enter image description here

一个WCF代理实际上只是一个抽象层,它是一个外部服务的进程内代表。你可以想象它是一个对象,根据你的绑定元素和数据合同生成并配置正确,这可以让你的客户端和服务器端相互理解。

3

是的,我认为您描述得很准确。 WCF具有“通道”的概念,开发人员倾向于在web.config中配置而不编写C#代码。

这些在通道模型概述中有所描述。

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

从您的角度,您将其视为一个对象进行交互。 框架处理单独通道的实现。 了解您正在通过这些层可以正确地配置它们。


0
在这种情况下,“代理”是指软件设计模式。来自维基百科
代理在其最一般的形式中,是一个作为接口到其他东西的类。代理可以与任何东西进行接口:网络连接、内存中的大型对象、文件或其他昂贵或不可能复制的资源。
在WCF的情况下,ChannelFactory<>.CreateChannel基于配置创建了一个通道堆栈。每个通道都提供对其下面的通道的抽象。例如,简化的通道堆栈可能是:
- 通道1将.NET对象序列化为SOAP消息 - 通道2向消息添加安全信息 - 通道3对要通过TCP发送的消息进行编码。
我想你都明白了。

回到“代理”使用:堆栈中的任何通道都是下面通道的代理。也就是说,没有任何通道是最终目的地。所有通道都是“与其他东西的接口”。然而,随着您向下移动通道堆栈,不同的通道为调用者提供了不同的接口/抽象(.NET对象、SOAP消息等)。

再次强调,本讨论旨在回答问题并故意简化。

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

作者使用了称为CreateChannel的方法,并将标识符命名为proxy。因此,在WCF架构中,代理只是一个特殊的高级通道,而不是独立的架构元素?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接