2009-10-05 7 views
77

Cela peut sembler une question idiote, mais tout dans WCF semble beaucoup plus compliqué que dans asmx, comment puis-je augmenter le timeout d'un service svc?Service WCF, comment augmenter le délai d'expiration?

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 point final obtient cartographié comme ceci:

<endpoint address="" 
    binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout" 
      contract="ServiceLibrary.IDownloads"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
      </endpoint> 

L'erreur exacte que je reçois:

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 pour demander ou augmenter la valeur SendTimeout sur la liaison. Le temps alloué à cette opération peut avoir été une partie d'un délai d'attente plus long.

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

Comme vous pouvez le voir ses pas les mêmes valeurs que je me suis fixé pour cela? 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> 

Répondre

23

La configuration du délai d'attente doit être fixé au niveau du client, de sorte que la configuration que je mettais dans le web.config n'a eu aucun effet, l'outil de test WCF a sa propre configuration et il est là que vous avez besoin pour définir le délai d'expiration.

+1

bien, oui - typiquement, il doit être réglé à la fois sur le client et le serveur, même - par exemple. en cas de "inactivityTimeout" sur des sessions et des choses comme ça. –

+7

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

+0

Si vous utilisez le 'WCF Test Client', faites un clic droit sur 'Config File' dans l'arborescence, puis cliquez sur 'Edit with SvcConfigEditor' et modifiez le délai d'attente dans les bindings. – Radderz

154

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

<bindings> 
    <basicHttpBinding> 
    <binding name="IncreasedTimeout" 
      sendTimeout="00:25:00"> 
    </binding> 
    </basicHttpBinding> 

Le plus important est le sendTimeout, qui dit combien de temps le client attend une réponse de votre service WCF . Vous pouvez spécifier hours:minutes:seconds dans vos paramètres - dans mon exemple, je définis le délai d'attente à 25 minutes.

Comme son nom l'indique, le temps que vous êtes prêt à attendre lorsque vous ouvrez la connexion à votre service WCF. De même, le closeTimeout correspond à la durée pendant laquelle vous fermez la connexion (disposez du proxy client) que vous attendez avant qu'une exception soit levée.

Le receiveTimeout est un peu comme un miroir pour la sendTimeout - alors que le délai d'envoi est la quantité de temps que vous attendez une réponse du serveur, le receiveTimeout est la quantité de temps que vous allez vous donner client recevoir et traiter la réponse du serveur. Dans le cas où vous envoyez des messages "normaux", les deux peuvent être assez courts - en particulier le receiveTimeout, car recevoir un message SOAP, le déchiffrer, le vérifier et le désérialiser ne devrait pas prendre beaucoup de temps. L'histoire est différente avec le streaming - 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 MSDN docs on binding vous donne plus d'informations sur leur utilité.

Pour obtenir une prise en main sérieuse sur tous les intricasies de WCF, je vous recommandons fortement d'acheter le « Learning WCF » livre 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 vous aussi passer un peu de temps à regarder ses 15 -part "série WCF Top to Bottom" screencast - fortement recommandé!

Pour des sujets plus avancés, je vous recommande de consulter le manuel des services Programming WCF de Juwal Lowy.

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

J'ai essayé d'ajouter les sections de liaison à dans web.config, mais son lancer une erreur maintenant .... toutes les étapes supplémentaires I 'ai manqué sur ... –

+0

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

+0

Je pense que je comprends - binding = "basicHttpBinding" bindingConfiguration = "IncreasedTimeout" –

4

Vous avez récemment rencontré la même erreur mais vous avez réussi à la résoudre en vous assurant de fermer chaque appel client de wcf. par ex.

WCFServiceClient client = new WCFServiceClient(); 
//More codes here 
// Always close the client. 
client.Close(); 

ou

using(WCFServiceClient client = new WCFServiceClient()) 
{ 
    //More codes here 
} 
+9

N'utilisez pas l'approche 'using': http: // omaralzabir.com/ne-utilisez-pas-dans-wcf-client/ –

+0

Dans les commentaires de http://omaralzabir.com/do-not-use-using-in-wcf-client, il y a des exemples de comment encore utilisez 'using 'sans disposer d'un objet de canal défectueux. Voici un autre blogueur avec une approche plus compatible avec les blocs 'using': http://erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper/. – Greg

13

La meilleure façon est de changer tout paramètre 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

bon conseil, merci – ukie

Questions connexes