2009-06-05 3 views
4

Lorsque je crée une application WCF à l'aide des modèles Visual Studio intégrés et que j'essaie de l'appeler lors d'une boucle, seules 5 demandes sont exécutées. Le service cesse ensuite de répondre. La seule façon de contourner ce problème est de fermer les connexions après chaque appel.Comment puis-je faire en sorte que WCF ferme automatiquement les connexions?

Je sais que vous êtes censé nettoyer après vous-même, mais je sais aussi que vous n'aviez pas à le faire avec les services Web. Beaucoup de gens qui vont frapper notre service ne fermeront pas leur connexion.

Existe-t-il un moyen d'obtenir le même comportement avec WCF?

Voici ma config

<system.serviceModel> 
    <services> 
     <service name="WorkflowLibrary1.Workflow1" behaviorConfiguration="WorkflowLibrary1.Workflow1.Service1Behavior"> 
     <endpoint address="" binding="wsHttpContextBinding" contract="WcfServiceLibrary1.IService1"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WorkflowLibrary1.Workflow1.Service1Behavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
+0

Où est le code? Aussi, WCF _is_ services Web. Parliez-vous de l'ancienne technologie ASMX? Vous devez vraiment nettoyer un proxy ASMX - il peut simplement échouer d'une manière différente si vous ne le faites pas. –

+0

Je comprends que je devrais nettoyer après moi-même, mais basé sur cette nouvelle façon, si quelqu'un s'intègre à notre service et ne ferme pas correctement les connexions pourrait essentiellement faire tomber nos serveurs! –

Répondre

1

Les 5 connexions vient probablement du serveur - vous pouvez définir le nombre de sessions ouvertes maximum, appels simultanés max, et les instances de serveur max par des serveurs comportement serviceThrottling.

En même temps, cela vous permettra-t-il d'augmenter le nombre de sessions simultanément ouvertes, je recommanderais quand même de nettoyer correctement après vous-même - même si vous n'aviez pas à le faire dans le passé .... .

Je suggère enroulant l'utilisation de votre proxy client dans une déclaration using comme ceci:

using(ClientProxy proxy = new ClientProxy()) 
{ 
    // go ahead, call your service methods 
} 

Mise à jour: comme commentor a à juste titre souligné, ce qui a il est Shar e de problèmes, puisque le client pourrait jeter une exception après avoir été disposé. Donc, cela peut ne pas fonctionner très bien - ou vous devez envelopper un try...catch autour d'elle pour gérer les cas où la fermeture du proxy client provoque un problème.

Voir Avoiding Problems with the Using Statement


De cette façon, le proxy client est automatiquement fermé et disposé quand la portée des extrémités du bloc à l'aide, et votre canal du client vers le serveur est libéré et le serveur est prêt recevoir un autre appel d'un autre client.

De plus, avec wsHttpContextBinding, vous devez vérifier si vous avez vraiment besoin des sessions activées par défaut - la meilleure pratique conseillée serait d'utiliser l'instanciation par appel sur le serveur, par ex. Chaque appelant instancie un nouvel objet serveur. Les sessions présentent toute une série de nouveaux problèmes et d'éventuels pièges, alors j'essayerais de les utiliser seulement quand je le devrais vraiment (et en tirer un avantage) - sinon, éteignez les sessions.

Marc

+3

Je ne mettrais pas de proxy dans l'instruction using, car WCF est cassé et dispose peut jeter. Utilisez try/catch/finally/et enfin utilisez try/catch pour fermer le canal et s'il le lance, pour l'annuler. –

+0

permettez-moi d'ajouter plus de détails, quand et si j'utilise toutes les connexions et ne les ferme pas après que j'ai fini, si je vais au serveur et regarde le perfmon pour l'application asp.net, je peux voir qu'il y a un Une seule requête a été réglée en tant que traitement et plus aucun reuqest n'est capable de passer à travers, je n'ai trouvé aucun moyen pour que le serveur accepte plus de requête autre que resetiis. J'ai juste du mal à croire que WCF rendrait le serveur si volontaire aux mauvaises pratiques côté client. Sur cette base, un seul client serait capable de DOS votre serveur sans même essayer. –

+0

Kay: cela peut être vrai - mais si vous avez cinq clients qui se sont connectés, ont établi une session, et n'ont pas été fermés correctement, alors vous aurez cinq sessions avec le serveur ouvert, et c'est la limite par défaut sur la limitation du serveur . –

Questions connexes