web-dev-qa-db-fra.com

Erreur de service trop occupé dans WCF

J'obtiens de manière intermittente l'exception suivante dans mon service .Net WCF. "Le service HTTP situé à l'adresse http: //MyServer/TestWCF/MyService.svc est trop occupé."

Est-ce que j'ai râté quelque chose?

J'utilise une liaison HTTP de base et j'ai activé la limitation WCF.

<basicHttpBinding>
        <binding name="BasicHttpBinding_MyService" maxReceivedMessageSize="2147483647"
                 messageEncoding="Text" textEncoding="utf-16" sendTimeout="00:01:00" >
          <readerQuotas maxStringContentLength="2147483647" maxArrayLength="163840000"
                        maxDepth="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="16384" />
        </binding>

....

<behavior name="MyWCFServices.MyServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceThrottling
                    maxConcurrentCalls="16"
                    maxConcurrentInstances="2147483647"
                    maxConcurrentSessions="10"/>
        </behavior>

La limitation aidera-t-elle à résoudre le problème? De plus, puis-je connaître les valeurs de paramètre recommandées pour la régulation pour un site Web à trafic important?

29
Steve Chapman

Vous pouvez certainement essayer d’augmenter les valeurs maxConcurrentSessions et maxConcurrentCalls de votre comportement de limitation de service aux valeurs standard de 30 environ et voir si cela élimine l’erreur. Un serveur trop occupé semblerait indiquer que plus de demandes ont été reçues que la zone autorisée par votre comportement de limitation de service et qu'elles ont été supprimées car aucune instance de service n'est devenue disponible pour les gérer dans le délai imparti.

10
marc_s

Ma réponse serait, vérifiez si le pool d'applications est bien en place?

J'ai vu cette erreur se produire lorsque le pool d'applications est mort en raison d'exceptions levées qui ne sont pas interceptées.

Considérez, par exemple, les sections de configuration personnalisées - le fait qu’une erreur soit signalée provoquera l’échec de votre application avant même son démarrage. Trop d'entre eux dans un court laps de temps vont tuer le pool d'applications.

9
Adam C.

Si votre service fonctionne sous votre compte (Identity), il est fort possible que vous ayez récemment changé de mot de passe. Vous devrez le réinitialiser pour son pool d'applications IIS dans Paramètres avancés | Boîte de dialogue d'identité.

4
Mark Bergan

Ce ne sont pas seulement les maxConcurrentSessions, c'est aussi la durée de la session.

Si le client ne ferme pas la connexion, celle-ci restera ouverte jusqu'à l'expiration du délai. Vous pourriez alors atteindre la limite maxConcurrentSessions avec très peu d’activité sur le serveur.

2
Shiraz Bhaiji

Assurez-vous également de vérifier l'exception interne; Au cours de nos déploiements, nous désactivons le pool d'applications d'un service Web WCF et les clients commencent à recevoir cette erreur pendant ce temps:

System.ServiceModel.ServerTooBusyException: le service HTTP situé à l'emplacement suivant: https://ourserver.x.com/path/service.svc est trop occupé. ---> System.Net.WebException: le serveur distant a renvoyé une erreur: (503) Server Unavailable.

Donc, dans ce cas, une erreur HTTP 503 est (mal?) Interprétée comme "serveur trop occupé".

2
ALEXintlsos

Je viens de rencontrer cette erreur, qui se résumait à un simple problème de configuration. J'ai eu un service sur le même port et la même interface (service factice). J'ai exécuté le service avec le commutateur de ligne de commande approprié pour exécuter le service "original" que je souhaitais. L'erreur est partie.

1
Arturo Hernandez

Je sais que la seule source de cette exception est si vous utilisez des sessions et que vous parvenez à appuyer sur la commande MaxPendingChannels. Sa valeur par défaut est quelque chose d'assez faible, comme 4. Vous pouvez essayer de le régler plus haut (128 par exemple) ou, si vous voulez simplement reproduire, définissez-le sur 1 et vous devriez le voir en test de charge.

Voir ici pour plus d'informations sur les sessions: http://msdn.Microsoft.com/en-us/library/ms733795.aspx

1
krisragh MSFT

Ma solution serait, Vérifiez le fichier App.Config, si le numéro de service est là pour ce service particulier. 

par exemple:

<service name="MyServices.ServiceName">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="TestBinding"   contract="MyServices.ServiceName">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <Host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/MyServices/ServiceName/" />
          </baseAddresses>
        </Host>
</service>
0
Arun Kumar T