2009-12-01 5 views
10

Ich verwende WCF in der Kommunikation zwischen einem Server und einem Client (beide in C# geschrieben).Programmgesteuertes WCF-Timeout im Debug-Modus

Im Freigabemodus sollten die Timouts auf ~ 20 Sekunden eingestellt sein, aber im Debug-Modus möchte ich sie auf einen höheren Wert setzen, damit ich meinen Code debuggen/betreten kann, ohne dass das Timeout auftritt.

Ich weiß, dass ich die Timeouts ändern kann, indem Sie die app.config-Datei ändern. Allerdings habe ich zwei verschiedene Bindungen und 4 Timeout-Werte in jedem, so dass ich an mehreren Stellen wechseln musste, und es ist leicht zu vergessen.

Um dies zu lösen, möchte ich einen kleinen #if DEBUG-Abschnitt in meinem Code haben, der die Timeout-Werte programmatisch auf 1 Stunde ändert.

Ich habe versucht, den folgenden Code zu verwenden, um dies zu tun:

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); 

aber die * Timeout Eigenschaften sind nur lesbar, damit ich einen Kompilierungsfehler erhalten.

Ich bin nicht begeistert von der Idee, Bindungen programmatisch neu zu erstellen. Wenn ich einige der Attribute in der app.config ändere, muss ich daran denken, die gleiche Änderung im Code vorzunehmen, um sicherzustellen, dass das Debug-Verhalten dem Release-Verhalten ähnlich ist (außer den Timeouts).

Jeder hat einen guten Tipp, wie man damit umgeht?

Antwort

12

Sie könnten wie folgt vorgehen:

  • die Bindung und den Endpunkt in Code erstellen
  • setzen die Timeouts auf die Bindung Instanz
  • dann Client-Proxy erstellen mithilfe dieser beiden Elemente

Etwas wie:

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); 

Auf diese Weise können Sie die grundlegende Konfiguration bei der Beschreibung von Bindungstimeouts nutzen und dennoch die gewünschten Einstellungen optimieren und Ihren Client-Proxy daraus erstellen.

2

Sie können eine zweite Bindung in der Datei web.config erstellen und ein längeres sendTimeout festlegen.

 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

In einem 'Klienten', das einzige Timeout meisten Menschen jemals brauchen, ist die 'sendTimeout' https://social.msdn.microsoft.com/Forums/vstudio/en- US/84551e45-19a2-4d0d-bcc0-516a4041943d/Erklärung der unterschiedlichen Timeout-Typen –

Verwandte Themen