L'augmentation de délai d'attente pour le service web WCF en c#
J'ai actuellement une application qui est l'appel d'un service web sur un serveur pour la recherche. On peut s'attendre à une grande quantité de données à renvoyer, donc une recherche de prendre plus d'une minute est la routine.
Nous avons reçu le message d'erreur ci-dessous pour un tel grand volume de recherche:
Le canal de demande dépassé pendant l'attente d'une réponse, après 00:00:59.7350618. Augmenter la valeur de délai d'expiration passée à l'appel à la Demande ou à l'augmentation de la SendTimeout valeur sur la Liaison. Le temps alloué à cette opération peut avoir été une partie d'un délai plus long.
C'est quelque chose que nous avons vu a demandé à plusieurs questions déjà posté sur StackOverflow, malheureusement, aucune des solutions disponibles m'ont aidé à résoudre le problème ou même être en mesure de configurer le temps par la fenêtre.
Nous avons tous les deux changé de l'application.config pour le client, l'augmentation de tous les délais d'attente impliqué (CloseTimeout, OpenTimeout, ReceiveTimeout, et SendTimeout) et de tout le web.config valeurs pour le service sur le serveur (closeTimeout, openTimeout, et SendTimeout).
Aucun de ces changements n'ont eu aucun effet, je continue à recevoir les minutes de délai d'attente. Aucune idée de pourquoi l'évolution de ces valeurs n'ont aucun effet?
Dans les exemples ci-dessous, nous avons abaissé le temps de nous empêcher d'avoir à attendre la minute pendant les essais.
Web.config:
<configuration>
<system.web>
<compilation targetFramework="4.0" />
</system.web>
<system.diagnostics>
<trace autoflush="true" />
<sources>
<source name="System.Net">
<listeners>
<add name="TraceFile" />
</listeners>
</source>
<source name="System.Net.Sockets">
<listeners>
<add name="TraceFile" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="TraceFile" type="System.Diagnostics.TextWriterTraceListener"
initializeData="trace.log" />
</sharedListeners>
<switches>
<add name="System.Net" value="Verbose" />
<add name="System.Net.Sockets" value="Verbose" />
</switches>
</system.diagnostics>
<system.serviceModel>
<diagnostics>
<messageLogging logMalformedMessages="false" logMessagesAtServiceLevel="false"
logMessagesAtTransportLevel="false" />
</diagnostics>
<services>
<service behaviorConfiguration="SearchIndexServiceBehavior" name="SearchIndex.Service">
<endpoint address="" binding="basicHttpBinding" contract="ISearchIndexServices" />
<host>
<timeouts closeTimeout="00:00:10" />
</host>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding closeTimeout="00:00:10" openTimeout="00:00:15" sendTimeout="00:00:20"
receiveTimeout="00:00:25" maxBufferSize="2147483647" maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="SearchIndexServiceBehavior">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<system.transactions>
<defaultSettings timeout="00:05:00" />
</system.transactions>
</configuration>
app.config
<configuration>
<configSections>
</configSections>
<startup>
</startup>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ISearchIndexServices" closeTimeout="00:00:10" openTimeout="00:00:15" receiveTimeout="00:10:00" sendTimeout="00:00:20" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="5242880" maxBufferPoolSize="524288" maxReceivedMessageSize="5242880" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="5242880"maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://MyServer/SearchIndexService/SearchIndexServices.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISearchIndexServices" contract="WFC.ISearchIndexServices" name="BasicHttpBinding_ISearchIndexServices" />
</client>
</system.serviceModel>
</configuration>
La description du problème ici peut par indicateur que votre
maxReceivedMessageSize
est peut-être trop petite. Bien que le message d'erreur serait plutôt bizarre. Mais je me souviens avoir eu ce problème il y a quelques temps.Je viens d'ajouter une référence de Service à Monserveur
OriginalL'auteur user1183014 | 2012-02-01
Vous devez vous connecter pour publier un commentaire.
Je pense que vous êtes probablement frapper les OperationTimeout pour le côté client canal de demande, ce qui n'est pas facilement ajusté par l'intermédiaire de la configuration standard des attributs.
Essayez ceci dans le code du client avant d'appeler l'opération de longue durée:
où
clientProxy
est une instance du service de référence généré par le Client de la classe (qui est un dérivé deClientBase<ISearchIndexService>
).myClient.InnerChannel.OperationTimeout = new TimeSpan(0,30,0);
. Ne regardez pas pourquoi.OriginalL'auteur Chris Dickson
Vous pouvez essayer ce
Cette réponse est utile, car il montre une autre façon d'accéder aux délais d'expiration de la WCF Client, sans l'aide de l'app.config. Dans mon cas, il m'aide parce que je ne voulais TESTER mon WebService rapidement [afin d'avoir un délai d'attente de 5 secondes]. ensuite, une fois que je sais que le WebService est au travail,
OriginalL'auteur Dinesh Kumar
Ce Modèle de Service montre l'exemple de l'élément de liaison délai d'attente des propriétés qui doivent être définies dans le client web.config.
Notez que toutes les propriétés de délai d'expiration est fixé à 10 minutes. Cet exemple utilise un de configuration de liaison élément pour définir le "maxItemsInObjectGraph" de la propriété. Habituellement, si vous avez besoin de tourner le délai d'attente, cela signifie que vous êtes probablement le transfert de grandes quantités de données. Notez également que la taille des données à outre possible de les transférer êtes tous ensemble pour gérer jusqu'à 2 gigaoctets.
OriginalL'auteur BuzzWilder
Le délai d'attente est l'envoi timeout sur le client. C'est combien de temps le client est prêt à attendre pour une réponse et doit être réglée sur le client plutôt que le service
Il semble que si votre paramètre de configuration n'est pas d'obtenir ramassé - avez-vous vérifié dans le débogueur si le client du proxy de liaison est certainement 20s?
Le SendTimeout ne couvre que le temps de l'achèvement du protocole de transport pour la livraison du message de requête au serveur. Si le message de Réponse, puis prend du temps à venir, ce délai d'attente n'est pas déclenché.
OriginalL'auteur Richard Blewett