2012-06-05 54 views
2

我有一個使用WCF獲取兩個應用程序相互交談的小型基本工作示例。我的客戶端應用程序監聽服務器,在配置我的設置的app.config文件中有XML。在編譯時硬編碼的一個設置是隱藏在basicHttpBinding設置下的sendTimeout設置。例如:如何在運行時更改basicHttpBinding sendTimeout?

<configuration> 
    <system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="BasicHttpBinding_IScriptRunHost" closeTimeout="00:05:00" 
        openTimeout="00:05:00" receiveTimeout="00:05:00" sendTimeout="00:00:15" 

我希望能夠在運行時(使用c#)設置sendTimeout屬性。然而,對於WCF來說,這是如此的新鮮,我不知道從哪裏開始?

+0

只需注意上面的代碼片段,該值就設置爲15秒。那只是爲了我的測試目的...... –

回答

6

您可以在代碼中執行您在配置文件中的任何操作。

ServiceClient _client = new ServiceClient(new BasicHttpBinding { SendTimeout = new TimeSpan(2, 0, 0) },new EndpointAddress("http://localhost:8089/MyService.svc")); 

或:您可以通過創建一個新的客戶端代理,並在運行時分配所需的結合配置,以動態地設置您超時或各種配置細節

BasicHttpBinding myBinding = new BasicHttpBinding(); 
       myBinding.OpenTimeout = new TimeSpan(2, 0, 0); 
       myBinding.CloseTimeout = new TimeSpan(2, 0, 0); 
       myBinding.SendTimeout = new TimeSpan(2, 0, 0); 

ServiceClient _client = new ServiceClient(); 
       _client.Endpoint.Binding = myBinding; 

但你也許可以推斷出通過查看代碼,如果您想在運行時更改超時值,服務端點或幾乎任何綁定配置,則必須拆除以前的客戶端代理並處理它並使用新的你創建的一個,顯然這有一些不良影響,因爲你的客戶會暫時與你的服務器斷開連接副,所以牢記這一點。你也可以在你的配置文件中定義2或3個(或者你想要的)綁定配置,然後創建一個新的客戶端並將其配置爲使用該綁定,這與代碼中的綁定幾乎完全相同。即使這樣,您也必須實例化新的客戶端代理才能使用不同的綁定配置。

+1

非常感謝。我會試一試,讓你知道它是如何工作的! –

+2

如何從舊的'BasicHttpBinding'實例複製設置?所以我不必用代碼替換大部分的app.config? –

+0

除此之外還有更多的問題可以解決。我如何處理舊的服務客戶端? –