webentwicklung-frage-antwort-db.com.de

Erhöhen des Zeitlimits in einem WCF-Dienst

Wie kann ich das Standardzeitlimit für einen WCF-Dienst auf mehr als 1 Minute erhöhen?

123
Blankman

Beziehen Sie sich auf die Serverseite oder die Clientseite?

Für einen Client möchten Sie das sendTimeout - Attribut eines Bindungselements anpassen. Für einen Dienst möchten Sie das Attribut receiveTimeout eines verbindlichen Elements anpassen.

<system.serviceModel>
  <bindings>
    <netTcpBinding>
      <binding name="longTimeoutBinding"
        receiveTimeout="00:10:00" sendTimeout="00:10:00">
        <security mode="None"/>
      </binding>
    </netTcpBinding>
  </bindings>

  <services>
    <service name="longTimeoutService"
      behaviorConfiguration="longTimeoutBehavior">
      <endpoint address="net.tcp://localhost/longtimeout/"
        binding="netTcpBinding" bindingConfiguration="longTimeoutBinding" />
    </service>
....

Natürlich müssen Sie den gewünschten Endpunkt der jeweiligen Bindung zuordnen.

184
icelava

Unter dem Menü Extras in Visual Studio 2008 (oder 2005, wenn Sie die richtigen WCF-Dateien installiert haben) gibt es eine Option namens "WCF Service Configuration Editor".

Von dort aus können Sie die Bindungsoptionen für den Client und die Dienste ändern. Eine dieser Optionen wird für Timeouts sein.

42
Kieron

Unterschiedliche Timeouts bedeuten verschiedene Dinge. Wenn Sie am Client arbeiten ... schauen Sie wahrscheinlich meistens auf SendTimeout - überprüfen Sie diese Referenz - wunderbare und relevante Erklärung: http://social.msdn.Microsoft.com/Forums/en- US/wcf/thread/84551e45-19a2-4d0d-bcc0-516a4041943d/

8
Arvind Gautam

Sie haben zwei Möglichkeiten:

1) Nach Code im Client

public static void Main()
{
    Uri baseAddress = new Uri("http://localhost/MyServer/MyService");

    try
    {
        ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService));

        WSHttpBinding binding = new WSHttpBinding();
        binding.OpenTimeout = new TimeSpan(0, 10, 0);
        binding.CloseTimeout = new TimeSpan(0, 10, 0);
        binding.SendTimeout = new TimeSpan(0, 10, 0);
        binding.ReceiveTimeout = new TimeSpan(0, 10, 0);

        serviceHost.AddServiceEndpoint("ICalculator", binding, baseAddress);
        serviceHost.Open();

        // The service can now be accessed.
        Console.WriteLine("The service is ready.");
        Console.WriteLine("Press <ENTER> to terminate service.");
        Console.WriteLine();
        Console.ReadLine();

    }
    catch (CommunicationException ex)
    {
        // Handle exception ...
    }
}

2) Über WebConfig in einem Webserver

<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding openTimeout="00:10:00" 
                 closeTimeout="00:10:00" 
                 sendTimeout="00:10:00" 
                 receiveTimeout="00:10:00">
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>

Für mehr Details sehen Sie die offiziellen Dokumentationen

Konfigurieren von Timeout-Werten für eine Bindung

Klasse WSHttpBinding

4
daniele3004

Zusätzlich zu den Timeouts für die Bindung (die in Timespans angegeben sind) benötigen Sie möglicherweise auch diese Option. Dies ist in Sekunden.

<system.web>
    <httpRuntime executionTimeout="600"/><!-- = 10 minutes -->
0
Derreck Dean