2009-12-01 8 views
10

Estoy usando WCF en la comunicación entre un servidor y un cliente (ambos escritos en C#).Establece programáticamente el tiempo de espera de WCF en el modo de depuración

En el modo de lanzamiento, los tiempos se deben establecer en ~ 20 segundos, pero en el modo de depuración quiero establecerlos en un valor mayor para que pueda depurar/pisar mi código sin que se agote el tiempo de espera.

Sé que puedo cambiar los tiempos de espera modificando el archivo app.config. Sin embargo, tengo dos enlaces diferentes y 4 valores de tiempo de espera en cada uno, así que tendría que cambiar en varios lugares, y es fácil de olvidar.

Para resolver esto, me gustaría tener una sección pequeña #if DEBUG en mi código que programáticamente cambia los valores de tiempo de espera a 1 hora.

He intentado utilizar el siguiente código para hacer esto:

Configuration configuration = 
     ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
ServiceModelSectionGroup serviceModel = 
     ServiceModelSectionGroup.GetSectionGroup(configuration); 

BindingsSection bindings = serviceModel.Bindings; 

foreach (var configuredBinding in bindings.WSHttpBinding.ConfiguredBindings) 
{ 
configuredBinding.CloseTimeout = new TimeSpan(0, 30, 0); 
configuredBinding.OpenTimeout = new TimeSpan(0, 30, 0); 

pero las propiedades de tiempo de espera * son de sólo lectura, así que conseguir un error de compilación.

No me gusta la idea de crear enlaces desde cero programáticamente. Si cambio algunos de los atributos en el app.config, debo recordar hacer el mismo cambio en el código para asegurarme de que el comportamiento de depuración sea similar al del release-behavior (excepto los tiempos de espera ...)

¿Alguien tiene un buen consejo sobre cómo manejar esto?

Respuesta

12

Se podría hacer lo siguiente:

  • crear el enlace y el punto final en el código
  • establezca los tiempos de espera en la instancia vinculante
  • continuación, crear el proxy cliente utilizando esos dos elementos

Algo así como:

BasicHttpBinding myBinding = new BasicHttpBinding("ConfigName"); 
myBinding.CloseTimeout = ....... 
myBinding.OpenTimeout = ....... 
myBinding.ReceiveTimeout = ....... 
myBinding.SendTimeout = ....... 

EndpointAddress myEndpoint = new EndpointAddress("http://server:8181/yourservice"); 

YourServiceClient proxy = new YourServiceClient(myBinding, myEndpoint); 

De esta manera, puede aprovechar la configuración básica al describir los tiempos de espera de enlace y, sin embargo, puede ajustar la configuración que desee y crear su proxy cliente a partir de ella.

2

Puede crear un segundo enlace en el web.config y establecer un SendTimeout más largo.

 if (debug) 
     { 
      proxy = new MyClient("WSHttpBinding_MyLocal"); 
     } 
     else 
     { 
      proxy = new MyClient("WSHttpBinding_MyDev"); 
     } 

     <wsHttpBinding> 
      <binding name="WSHttpBinding_MyLocal" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:20:00" 

...

+0

En un 'Client', el único tiempo de espera de la mayoría de la gente necesitará siempre es el' sendTimeout' https://social.msdn.microsoft.com/Forums/vstudio/en- US/84551e45-19a2-4d0d-bcc0-516a4041943d/explaination-of-different-timeout-types –

Cuestiones relacionadas