Aumentare il valore di timeout in un servizio WCF


133

Come posso aumentare il timeout predefinito a più di 1 minuto su un servizio WCF?


Ciò che non è chiaro, ma penso che tu lo stia chiedendo implicitamente, è se è possibile configurare sul lato server o meno per il timeout di tutte le chiamate che richiedono più di un minuto per l'elaborazione. Questo non è possibile
gravidThensts

Risposte:


196

Ti riferisci al lato server o lato client?

Per un client, si desidera regolare l' attributo sendTimeout di un elemento di associazione. Per un servizio, si desidera modificare l' attributo receTimeout di un elemnent vincolante.

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

Naturalmente, è necessario mappare l'endpoint desiderato a quel particolare bind.


Come posso mappare l'associazione, usando 'bindingname' all'interno del tag endpoint?
Blankman,

Questo è semplicemente sbagliato Il receiveTimeoutlato server regola la determinazione dell'ozio per i collegamenti basati sulla sessione. Ad esempio, il server non utilizzerà questa impostazione per i collegamenti basicHTTP. Devi eseguire il rollout del timeout di elaborazione sul lato server per WCF
gravid

45

Nel menu Strumenti di Visual Studio 2008 (o 2005 se hai installato il contenuto WCF corretto) è disponibile un'opzione chiamata "Editor di configurazione del servizio WCF".

Da lì è possibile modificare le opzioni di associazione sia per il client che per i servizi, una di queste opzioni sarà per i timeout.


Lo strumento è un ottimo modo per evitare errori come avvolgere gli elementi nel modo sbagliato, ortografia, ecc. Buona chiamata!
markaaronky,

vedi anche qui per l'altro strumento per aprire i file di log: stackoverflow.com/a/34283667/187650
Jufo


8

Puoi scegliere due modi:

1) Per codice nel 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) Da WebConfig in un server web

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

Per maggiori dettagli guarda la documentazione ufficiale

Configurazione dei valori di timeout su un binding

Classe WSHttpBinding


0

Oltre ai timeout di associazione (che sono in Timespans), potresti anche aver bisogno di questo. Questo è in pochi secondi.

<system.web>
    <httpRuntime executionTimeout="600"/><!-- = 10 minutes -->
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.