Augmentation de la valeur du délai d'expiration dans un service WCF

133

Comment augmenter le délai d'expiration par défaut à plus d'une minute sur un service WCF?

Blankman
la source
Ce qui n'est pas clair, mais je pense que vous demandez implicitement, c'est s'il est possible ou non de configurer côté serveur pour expirer les appels qui prennent plus d'une minute à traiter. Ce n'est pas possible
gravidThoughts

Réponses:

196

Faites-vous référence au côté serveur ou côté client?

Pour un client, vous voudrez ajuster l' attribut sendTimeout d'un élément de liaison. Pour un service, vous souhaiterez ajuster l' attribut receiveTimeout d'un élément de liaison.

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

Bien sûr, vous devez mapper votre point de terminaison souhaité à cette liaison particulière.

icelava
la source
Comment mapper la liaison, en utilisant «bindingname» dans la balise de point de terminaison?
Blankman
C'est tout simplement faux. Le receiveTimeoutcôté serveur régit la détermination de l'inactivité pour les liaisons basées sur la session. Par exemple, le serveur n'utilisera pas ce paramètre pour les liaisons basicHTTP. Vous devez rouler vos propres délais de traitement côté serveur pour WCF
gravidThoughts
45

Sous le menu Outils de Visual Studio 2008 (ou 2005 si vous avez installé le bon élément WCF), il existe une option appelée «Éditeur de configuration de service WCF».

De là, vous pouvez modifier les options de liaison pour le client et les services, l'une de ces options sera pour les délais d'expiration.

Kieron
la source
L'outil est un excellent moyen d'éviter les erreurs telles que l'encapsulation des éléments dans le mauvais sens, l'orthographe, etc. Bon appel!
markaaronky
voir aussi ici pour l'autre outil pour ouvrir les fichiers journaux: stackoverflow.com/a/34283667/187650
juFo
8

Vous pouvez choisir deux manières:

1) Par code dans le 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) Par WebConfig dans un serveur 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>

Pour plus de détails voir les documentations officielles

Configuration des valeurs de délai d'expiration sur une liaison

Classe WSHttpBinding

daniele3004
la source
0

En plus des délais de liaison (qui sont en Timespans), vous pouvez également en avoir besoin. C'est en quelques secondes.

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