2008-12-26 18 views
4

當一個人撥打打開方法IRequestChannel究竟發生了什麼?舉例來說,如果我有以下代碼:WCF RequestChannel;什麼真的發生?

ChannelFactory<IRequestChannel> factory = new ChannelFactory<IRequestChannel>(); 
// using a netTcpBinding to a net.tcp://localhost:9999/Bar 
IRequestChannel outchannel = factory.CreateChannel(); 
outchannel.Open(); // what happens here? 
if (outchannel.State == CommunicationState.Opened) 
{ 
    success = true; 
} 
outchannel.Close(); 

我似乎獲得與他人準確失敗的一些服務「誤報」。如果這不會以某種方式確認頻道是開放的,我會假設我總會得到誤報。

任何有關改進的建議?我想避免發送消息,因爲這只是爲了測試服務的診斷測試的可行性,但如果這是必要的,我可以。


我從我們的配置文件中注意到,返回誤報的信道使用以下behaviorConfiguration:

<binding name="secureNetTcpStream" maxBufferSize="2000000" maxReceivedMessageSize="2000000000" transferMode="Streamed" sendTimeout="00:05:00" receiveTimeout="14:00:00"> 
    <readerQuotas maxStringContentLength="2000000000" maxArrayLength="2000000000" /> 
    <security mode="TransportWithMessageCredential"> 
     <message clientCredentialType="UserName" /> 
    </security> 
</binding> 

我不知道流行爲的配置是什麼導致了IRequestChannel顯示它是​​開放的即使主機和服務不可用?

回答

3

調用Open函數確實會聯繫服務器端並打開通信通道。

但是,在Open可能會成功但可能會調用其中一種服務方法失敗。

例如:如果客戶端調用發起會話服務的方法和服務器已達到其最大會話數,則函數將失敗,服務器繁忙異常。所以即使你有一個開放的頻道,你也可能無法創建一個會話。

有可能在即使通道被成功打開一個服務的其他各種故障。

摘要: 您的檢查是好的,但可能還有其他的「障礙」,這將干擾客戶端服務器通信。這些可能是你的誤報...