2013-03-04 44 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操作合同。