97 votes

Service WCF, comment augmenter le délai d'attente?

Peut sembler être une question idiote, mais tout dans WCF semble beaucoup plus compliqué que dans asmx, comment puis-je augmenter le délai d'attente d'un service svc?

Voici ce que j'ai jusqu'à présent:

Et puis mon point de terminaison est mappé comme ceci:

L'erreur exacte que je reçois:

Le canal de requête a expiré en attente d'une réponse après 00:00:59.9990000. Augmentez la valeur du délai d'attente passée à l'appel à Request ou augmentez la valeur de SendTimeout sur le Binding. Le temps alloué à cette opération peut avoir été une partie d'un délai d'attente plus long.

Dans le client de test WCF, il y a une icône de configuration qui contient la configuration d'exécution de mon service:

Comme vous pouvez le constater, ce ne sont pas les mêmes valeurs que celles que j'ai définies pour lui? Que fais-je de mal?

185voto

marc_s Points 321990

Dans votre configuration de liaison, il y a quatre valeurs de délai d'attente que vous pouvez ajuster :

Le plus important est le sendTimeout, qui indique pendant combien de temps le client attendra une réponse de votre service WCF. Vous pouvez spécifier heures:minutes:secondes dans vos paramètres - dans mon exemple, j'ai défini le délai d'attente à 25 minutes.

L'openTimeout, comme son nom l'indique, est le temps que vous êtes prêt à attendre lorsque vous ouvrez la connexion à votre service WCF. De même, le closeTimeout est le temps que vous attendrez avant qu'une exception ne soit lancée lorsque vous fermez la connexion (fermez le proxy client).

Le receiveTimeout est un peu comme un miroir pour le sendTimeout - tandis que le délai d'envoi est le temps que vous attendrez une réponse du serveur, le receiveTimeout est le temps que vous donnerez à votre client pour recevoir et traiter la réponse du serveur.

Dans le cas où vous envoyez des messages "normaux" dans les deux sens, les délais peuvent être assez courts - surtout le receiveTimeout, car la réception d'un message SOAP, le déchiffrement, la vérification et la désérialisation devraient prendre presque aucun temps. Cependant, c'est différent avec le streaming - dans ce cas, vous pourriez avoir besoin de plus de temps sur le client pour compléter effectivement le "téléchargement" du flux que vous recevez du serveur.

Il y a aussi openTimeout, receiveTimeout et closeTimeout. La documentation MSDN sur les liaisons vous donne plus d'informations sur leur utilisation.

Pour maîtriser toutes les subtilités de WCF, je vous recommande vivement d'acheter le livre "Learning WCF" de Michele Leroux Bustamante :

Learning WCF http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

et passez également du temps à regarder sa série de 15 vidéos "WCF Top to Bottom" - fortement recommandée !

Pour des sujets plus avancés, je vous recommande de consulter le livre de Juwal Lowy "Programming WCF Services".

Programming WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

0 votes

J'ai essayé d'ajouter les sections de liaison à dans le fichier web.config, mais il lance maintenant une erreur.... y a-t-il d'autres étapes que j'aurais manquées...

0 votes

J'ai également changé le point de terminaison dans mon service vers le

0 votes

Je crois que j'ai compris - binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout"

28voto

user3891644 Points 1

La meilleure façon est de modifier tous les paramètres que vous voulez dans votre code.

Découvrez l'exemple ci-dessous:

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);
}

0 votes

C'est une meilleure solution plutôt que de mettre à jour la configuration alors je peux configurer une valeur différente pour différents appels et services, merci beaucoup

26voto

JL. Points 16055

La configuration de délai d'attente doit être définie au niveau du client, donc la configuration que je mettais dans le web.config n'avait aucun effet, l'outil de test WCF a sa propre configuration et c'est là que vous devez définir le délai d'attente.

1 votes

Eh bien, oui - généralement, cela doit être configuré à la fois sur le client et sur le serveur, même - par exemple, en cas de "inactivityTimeout" sur les sessions et des choses comme ça.

8 votes

JL: pouvez-vous montrer exactement ce que vous avez fait? J'ai le même problème

0 votes

Si vous utilisez le 'Client de test WCF', faites un clic droit sur 'Fichier de configuration' dans l'arborescence des services, puis cliquez sur 'Modifier avec SvcConfigEditor' et changez le délai d'attente dans les liaisons.

4voto

arjaye Points 21

Récemment, j'ai eu la même erreur mais j'ai pu la corriger en m'assurant de fermer chaque appel client WCF. Par exemple :

WCFServiceClient client = new WCFServiceClient ();
// Plus de codes ici
// Toujours fermer le client.
client.Close();

ou

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    // Plus de codes ici 
}

10 votes

Ne pas utiliser l'approche 'using' : omaralzabir.com/do-not-use-using-in-wcf-client

0 votes

Dans les commentaires de omaralzabir.com/do-not-use-using-in-wcf-client, il y a des exemples de la façon d'utiliser quand même using, tout en ne disposant pas d'un objet de canal défectueux. Voici un autre blogueur avec une approche plus compatible avec les blocs using : erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper.

0voto

Hassan Afshar Points 1
public static WebHttpBinding GetBinding()
{
    var binding = new WebHttpBinding
    {
        ReceiveTimeout = TimeSpan.MaxValue,
        SendTimeout = TimeSpan.MaxValue,

        MaxBufferPoolSize = int.MaxValue,
        MaxReceivedMessageSize = int.MaxValue,
        Security =
            {
                Mode = WebHttpSecurityMode.None,   
                Transport = {ClientCredentialType = HttpClientCredentialType.None}
            },
        //ProxyAddress = new Uri("", UriKind.Absolute),
        UseDefaultWebProxy = false
    };
    return binding;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X