Erhöhen des Timeout-Werts in einem WCF-Dienst


133

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


Was nicht klar ist, aber ich denke, Sie fragen implizit, ob es möglich ist, auf der Serverseite zu konfigurieren, dass Anrufe, deren Verarbeitung länger als eine Minute dauert, zeitlich begrenzt werden. Dies ist nicht möglich
gravidThoughts

Antworten:


196

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 Bindungselements 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 Ihren gewünschten Endpunkt dieser bestimmten Bindung zuordnen.


Wie ordne ich die Bindung mithilfe von 'Bindungsname' im Endpunkt-Tag zu?
Blankman

Das ist einfach falsch Das receiveTimeoutauf der Bestimmung des Nichtstuns regelt Server - Seite für sitzungsbasierten Bindungen. Beispielsweise verwendet der Server diese Einstellung nicht für grundlegende HTTP-Bindungen. Sie müssen Ihre eigenen serverseitigen Verarbeitungszeitlimits für WCF
rollen

45

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

Von dort aus können Sie die Bindungsoptionen sowohl für den Client als auch für die Services ändern. Eine dieser Optionen ist eine Zeitüberschreitung.


Das Tool ist ein guter Weg, um Fehler wie falsches Einpacken der Elemente, Rechtschreibung usw. zu vermeiden. Guter Anruf!
Markaaronky

Siehe auch hier für das andere Tool zum Öffnen der Protokolldateien: stackoverflow.com/a/34283667/187650
juFo


8

Sie können zwei Möglichkeiten wählen:

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) Von WebConfig auf 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>

Weitere Einzelheiten finden Sie in den offiziellen Dokumentationen

Konfigurieren von Timeout-Werten für eine Bindung

Klasse WSHttpBinding


0

Zusätzlich zu den Bindungszeitüberschreitungen (die in Timespans angegeben sind) benötigen Sie möglicherweise auch diese. Dies ist in Sekunden.

<system.web>
    <httpRuntime executionTimeout="600"/><!-- = 10 minutes -->
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.