Cela peut sembler une question idiote, mais tout dans la WCF semble beaucoup plus compliqué que dans le asmx, comment puis-je augmenter le délai d’attente d’un service svc?
Voici ce que j'ai jusqu'à présent:
<bindings>
<basicHttpBinding>
<binding name="IncreasedTimeout"
openTimeout="12:00:00"
receiveTimeout="12:00:00" closeTimeout="12:00:00"
sendTimeout="12:00:00">
</binding>
</basicHttpBinding>
</bindings>
Et puis mon noeud final est mappé comme ceci:
<endpoint address=""
binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout"
contract="ServiceLibrary.IDownloads">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
L'erreur exacte que j'obtiens:
Le canal de demande a expiré en attendant une réponse après 00: 00: 59.9990000. Augmentez la valeur de délai d'attente transmise à l'appel de Request ou augmentez la valeur SendTimeout dans la liaison. Le temps alloué à cette opération peut être une partie d'un délai d'attente plus long.
Dans le client de test WCF, une icône de configuration contient la configuration d'exécution de mon service:
Comme vous pouvez le voir, ce ne sont pas les mêmes valeurs que celles que j'ai définies? Qu'est-ce que je fais mal?
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IDownloads" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="">
<extendedProtectionPolicy policyEnforcement="Never" />
</transport>
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
La configuration du délai d'expiration doit être définie au niveau du client. Par conséquent, la configuration que j'avais définie dans le fichier web.config n'a aucun effet, l'outil de test WCF possède sa propre configuration et vous devez définir le délai d'expiration.
Dans votre configuration de liaison, il existe quatre valeurs de délai d'expiration que vous pouvez modifier:
<bindings>
<basicHttpBinding>
<binding name="IncreasedTimeout"
sendTimeout="00:25:00">
</binding>
</basicHttpBinding>
Le plus important est le sendTimeout
, qui indique combien de temps le client attendra une réponse de votre service WCF. Vous pouvez spécifier hours:minutes:seconds
dans vos paramètres - dans mon exemple, je règle le délai d’attente à 25 minutes.
Le openTimeout
comme son nom l'indique est la durée pendant laquelle vous êtes prêt à attendre lorsque vous ouvrez la connexion à votre service WCF. De même, le closeTimeout
est la durée pendant laquelle vous fermez la connexion (disposez le proxy du client) avant de lever une exception.
Le receiveTimeout
est un peu comme un miroir pour le sendTimeout
- tandis que le délai d’envoi correspond au temps d’attente d’une réponse du serveur, le receiveTimeout
est le temps que vous accorderez à votre client pour recevoir et traiter la réponse du serveur.
Si vous envoyez des messages "normaux", les deux peuvent être assez courts - en particulier le receiveTimeout
, car recevoir un message SOAP, le décrypter, le vérifier et le désérialiser) L’histoire est différente avec la diffusion en continu - dans ce cas, vous aurez peut-être besoin de plus de temps sur le client pour terminer le "téléchargement" du flux que vous récupérez du serveur.
Il y a aussi openTimeout, receiveTimeout et closeTimeout. Le documentation MSDN sur la liaison vous donne plus d'informations sur leur utilité.
Pour bien saisir toutes les subtilités de la WCF, je vous recommande fortement d'acheter le livre " Learning WCF " de Michele Leroux Bustamante:
et vous passez également un peu de temps à la regarder. Elle comprend 15 séries de screencast " WCF Top to Bottom " - hautement recommandé!
Pour des sujets plus avancés, je vous recommande de consulter le livre de services Programming WCF de Juwal Lowy.
Le meilleur moyen est de modifier les paramètres de votre code.
Découvrez l'exemple ci-dessous:
using(WCFServiceClient client = new WCFServiceClient ())
{
client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);
}
Vous avez récemment rencontré la même erreur, mais vous avez résolu le problème en fermant tous les appels de client wcf. par exemple.
WCFServiceClient client = new WCFServiceClient ();
//More codes here
// Always close the client.
client.Close();
ou
using(WCFServiceClient client = new WCFServiceClient ())
{
//More codes here
}