2015-11-18 42 views
1

我對here中的文章有疑問。相關的代碼如下。從DuplexChannelFactory類型中未調用構造函數<T>

public CustomClientChannel(string configurationPath) : base(typeof(T)) 
    { 
     this.configurationPath = configurationPath; 
     base.InitializeEndpoint((string)null, null); 
    } 

    protected override ServiceEndpoint CreateDescription() 
    { 

     ServiceEndpoint serviceEndpoint = base.CreateDescription(); 
     ExeConfigurationFileMap map = new ExeConfigurationFileMap(); 
     map.ExeConfigFilename = this.configurationPath; 
     Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); 
     ServiceModelSectionGroup group = ServiceModelSectionGroup.GetSectionGroup(config); 
     ChannelEndpointElement selectedEndpoint = null; 
     ...... 
    } 

第一功能是在類的構造函數,第二個在過載的DuplexChannelFactory功能CreateDescription由於從DuplexChannelFactory類inherents。

但是,當我使用這個類來創建一個對象時,代碼直接運行到CreateDescription()中。

因此,即使我將一個configurationPath傳遞給構造函數,this.configurationPath仍爲null。

如果我固有的ChannelFactory CustomClientChannel類,那麼它工作正常。

請幫忙看看有什麼不對,以及ChannelFactory和DuplexChannelFactory有什麼區別?我正在使用netTcpBinding。謝謝。

+0

你如何實例化CustomClientChannel? – GazTheDestroyer

回答

0

讓我們先從

是什麼的ChannelFactory和 DuplexChannelFactory之間的區別?

首先有必要了解WCF中的simplex and duplex通信之間的區別。

單工連接就像是發送短信,然後收到傳送通知 - 即使在較低的傳送級別,手機和運營商之間可能會有多個呼叫,從通信級別開始,您將發送短信只在一個方向。

雙工連接就像打個電話,你可以將語音數據發送到您的運營商和運營商可以在另一個方向同時發送語音數據。這需要一個雙向打開的單工通道。

ChannelFactory和DuplexChannelFactory都可用於創建客戶端服務通道。

您選擇哪一個取決於您要調用的服務是否暴露單工或雙工服務操作,以及您作爲comsumer是否需要使用這些操作。

如果服務暴露正常(即,單工)操作,例如:

void DoCoSomething(int x); 

List<Things> GetThings(); 

等等

...那麼你就可以消耗與的ChannelFactory這些操作。

如果服務暴露了callback contract

public interface IMyDuplexCallback 
{ 
    [OperationContract(IsOneWay = true)] 
    void NotifyMeOf(string message); 
} 

例如,以發送通知或某種給消費者的消息,你作爲一個消費者想利用這一點,你可以使用DuplexChannelFactory調用服務(當然在客戶端實現回調協議後)。

作爲一般規則,WCF中的雙工通信最好是複雜的,因此最好避免。

感謝這並不能解決您的原始問題。

1

您的構造函數正在調用一個只有一種類型的基構造函數。

: base(typeof(T)) 

兩個ChannelFactory<T>DuplexChannelFactory<T>實施保護構造函數單一類型的,但它們是不同的

ChannelFactory<T>想要通道類型。

DuplexChannelFactory<T>希望回調實例

換句話說,他們這樣做完全不同的事情,可以有完全不同的代碼路徑。受保護的構造函數只能用於派生類型,並且通常會推斷關於類層次結構如何工作的一定程度的知識。

你會更好地選擇公共構造函數,你通常會使用,並調用它。如果這是不可能的,那麼你需要制定相應的DuplexChannelFactory構造函數來調用。