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?

Blankman
quelle
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.

Icelava
quelle
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.

Kieron
quelle
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

daniele3004
quelle
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 -->
Derreck Dean
quelle