2010-06-27 87 views
2

我有以下代碼:System.ServiceModel.ClientBase連接到服務

public partial class MyServiceClient : System.ServiceModel.ClientBase<... 

if (m_MyClient == null) 
    m_MyClient = new MyServiceClient 
     ("BasicHttpBinding_IMyService", remoteAddress); 

WriteOutput("Successfully connected to service"); 

我的問題是我怎麼知道我的客戶實際上是在這一點上連接到服務?我想顯示失敗或成功的消息。

回答

2

當您創建客戶端時,並且沒有發生異常,例如EndpointNotFoundException已發生 - 那麼您將與服務「連接」,這意味着:客戶端和服務之間的通信通道已準備好用於發送消息來來回回。這就是所有 - 服務器端沒有任何東西可以真正處理你的通話(除了通道監聽器,如果有消息到達,它將被激活)。

您還可以查看客戶通道的.State財產 - 理想情況下,應該在這一點上是Opened

使用這個,如果你從ClientBase<T>

m_MyClient.State == CommunicationState.Opened 

推導或者這是你使用Visual Studio中的Add Service Reference功能生成的標準客戶端類:

(m_MyClient as IClientChannel).State == CommunicationState.Opened 
+0

礦井下面的代碼: m_MyClient = new MyServiceClient(「BasicHttpBinding_IMyService」,remoteAddress); 絕不會引發異常。只有當我嘗試與服務進行通信時,我是否會遇到異常。 如果我的客戶端實際連接,我想在那個代碼之後找出正確的代碼? – Tamer 2010-06-28 06:09:59

+0

@Tamer:**你有什麼**異常?在WCF中,你本身並不真正「連接」 - 你有一個可用於發送消息的通道 - 但是沒有像ADO.NET或類似的東西的真正連接... – 2010-06-28 06:17:02

+0

更新: 以下代碼: ( m_MyClient作爲IClientChannel).State == CommunicationState.Opened 崩潰。 正確的是: m_MyClient.State == CommunicationState.Opened 現在有趣的是CommunicationState總是被創建。它從來沒有真正打開,它始終保持創建。它只有在通信實際發生後纔會打開。就像我打電話給: m_MyClient.GetComments(); 然後我檢查狀態,纔打開它。 – Tamer 2010-06-28 06:33:12

1

意識到我在我上面的評論中提及了之後,我才意識到回答我的問題如下:

在我的ServiceContract我增加了以下內容:

[OperationContract] 
bool IsAlive(); 

誰implentation只是看起來如下:

public bool IsAlive() 
{ 
    return true; 
} 

然後改變了我的代碼如下:

m_MyClient = new MyServiceClient("BasicHttpBinding_IMyService", remoteAddress); 

try 
{ 
    m_MyClient.IsAlive(); 
} 
catch (EndpointNotFoundException) 
{ 
    WriteOutput("Unable to connect to service"); 

    m_MyClient = null; 
} 

if (m_MyClient != null) 
    WriteOutput("Successfully connected to service"); 
+0

這是無關緊要的問題,但現在我必須等待大約一分鐘纔會解除異常,因爲這一切都將在本地網絡上運行,我如何減少超時時間? 我嘗試減少我的客戶端上的receiveTimeout,但它沒有奏效。 – Tamer 2010-06-28 08:08:35