我对代理和频道感到困惑。根据我的阅读,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();
}
答案 0 :(得分:11)
在WCF中,您有3个主要组件 - 合同,地址和绑定。通道是一根管子,根据这三个部分建造。
频道的目的是将消息修改为格式,这对于客户端和服务器都是可以理解的,并且可以组织它正确的传输。传输和协议通道用于此目的。为了简化此过程,我们使用绑定。每个绑定由元素组成,这些元素表示通道堆栈中的某个通道。
因此,每当您调用方法时,它会根据您的DataContract形成消息,并将其传递给整个通道链。每个频道都会修改您的消息。好处看起来像这样
WCF代理实际上只是一个抽象层次。它是进程外服务的进程内代表。您可以将它想象为一个对象,根据您的绑定元素和dataContract生成并正确配置,这允许您的客户端和服务器端相互理解。
答案 1 :(得分:3)
是的,我认为你准确地描述了这一点。 WCF有这个“渠道”的概念, 开发人员倾向于在web.config和中配置 不要写C#代码。
这些在Channel Model Overview中有所描述。
当您致电ChannelFactory.CreateChannel(binding,address);
时,框架会查看您的配置
并为您创建所有这些通道作为一个对象。所以是的,代理就像是一堆渠道。
从最后,您将其作为一个对象与之互动。该框架涉及实施 分开的渠道。了解你正在经历这些层面,这仍然是很好的 你可以正确配置它们。
答案 2 :(得分:0)
在这种情况下,“proxy”是对软件设计模式的引用。 From Wikipedia:
代理,最常见的形式,是一个充当的类 接触其他东西。代理可以与任何东西连接:a 网络连接,内存中的大对象,文件或其他 资源昂贵或无法复制。
在WCF的情况下,ChannelFactory&lt;&gt; .CreateChannel根据配置创建channel stack。每个通道都为其下方的通道提供抽象。例如,简化的通道堆栈可能是:
我想你明白这一切。
回到“代理”的使用:堆栈中的任何通道都是其下方通道的代理。也就是说没有频道是最终目的地。所有渠道都是“与其他东西的接口”。但是,当您向下移动通道堆栈时,不同的通道会向调用者提供不同的接口/抽象(.NET对象,SOAP消息等)。
此讨论再次是为了回答问题并故意简化。
在编写客户端代码时,最有用的接口是了解.NET对象的接口。知道这一点,ChannelFactory返回堆栈顶部的通道,该通道具有与您的服务合同匹配的.NET接口。将SOAP消息创建为字符串,沿着通道堆栈向下(或创建自定义堆栈),找到接受原始SOAP消息的通道,标记“代理”并直接调用它是有效的。
作者使用了名为CreateChannel的方法并命名了标识符 代理。所以在WCF架构中,Proxy只是一个特殊的高级别 渠道,它不是一个独立的架构元素?
Channel是一个实现代理软件设计模式的架构元素。所有渠道都是代理。当您编写客户端代码时,顶级通道恰好是最有用的,因为它接受.NET操作契约。