8

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

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

  • 什么时候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();  
    }  
    
4

3 回答 3

11

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

在此处输入图像描述

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

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

在此处输入图像描述

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

于 2013-03-13T12:56:43.547 回答
3

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

这些在通道模型概述中进行了描述。

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

从你的角度来看,你与它作为一个对象进行交互。该框架处理单独通道的实现。很高兴了解您正在浏览这些层,以便您可以正确配置它们。

于 2013-03-04T12:19:51.350 回答
0

在这种情况下,“代理”是对软件设计模式的引用。来自维基百科

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

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

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

我想你明白这一切。

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

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

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

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

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

于 2013-03-14T17:23:20.597 回答