Question Le canal de demande a expiré en attendant une réponse


J'ai une petite application qui utilise WCF pour communiquer avec un serveur Web. Ce programme est utilisé par quelque 200 clients et chaque client envoie environ 5 à 20 requêtes / min.

En regardant les journaux d'erreur, j'obtiens souvent:

Le canal de demande a expiré en attendant une réponse après   00: 00: 59.9989999

Les demandes sont faites comme suit:

ClientService Client = new ClientService();
Client.Open();
Client.updateOnline(userID);
Client.Close();

Ceci est le app.config

<configuration>
<configSections>
</configSections>
<startup><supportedRuntime version="v2.0.50727"/></startup><system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_IClientService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />
                <security mode="None">
                    <transport clientCredentialType="Windows" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="Windows" negotiateServiceCredential="true" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="PATH TO SERVICE"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IClientService"
            contract="IClientService" name="WSHttpBinding_IClientService">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

Parmi les "nombreux appels", environ 200 à 800 par jour échouent. Et à propos de n-1, ça va. Je suis très confus quant à la nature du problème. En regardant les statistiques du serveur, il est difficile de créer une sueur - chaque demande prend moins de 2 secondes à traiter. Les données envoyées sont constituées de "int" ou "très petites chaînes" - donc, ce n'est pas dû à la taille, si c'était le cas - il devrait y avoir un échec cohérent.

Suggestions?


24
2018-06-26 20:36


origine


Réponses:


Il semble que vos requêtes soient en attente sur le serveur avant d’être traitées et qu’elles commencent à expirer. Vous pouvez essayer quelques choses ici pour voir exactement ce qui se passe

1) Essayez de limiter vos services WCF, par exemple: Essayez d’augmenter vos sessions simultanées. Regarde WCF étranglement

2) Essayez d'utiliser PerCall plutôt que d'utiliser Sessions ici pour vous assurer qu'aucune session n'y reste.  Voici ce que vous pouvez faire sur votre interface pour supprimer une session

[ServiceContract(Namespace="YOUR NAMESPACE", SessionMode=SessionMode.NotAllowed)]

et vos classes de contrat implémentant ces interfaces

ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

ET .... Vous devriez permettre le traçage pour voir exactement ce qui se passe.


9
2018-06-26 21:34



Essayez d'ajouter les valeurs de délai d'attente au service ET au client:

<binding name="BasicHttpBinding_SomeName" closeTimeout="00:01:00"
    openTimeout="00:01:00" receiveTimeout="00:10:00"
    sendTimeout="00:10:00" maxBufferPoolSize="2147483647"
    maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">

28
2018-05-02 15:51



Vérifiez ce compteur de performance - ASP.NET Requests Queued.

Une application Web peut héberger de nombreuses pages Web et services. IIS ne traite que 12 demandes simultanées par cœur de processeur par défaut.

Cela signifie que même si votre service est rapide mais que d'autres pages / services sont lents, votre demande doit attendre dans la file d'attente avant d'être exécutée.

ASP.NET Requests Queued devrait être nul ou proche de zéro.

Voir Compteurs de performance pour ASP.NET sur MSDN.


3
2018-06-26 21:28