2012-06-05 134 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

除此之外还有更多的问题可以解决。我如何处理旧的服务客户端? –