2017-05-05 2 views
0

J'ai un service WCF qui dans functionA effectue un appel HttpWebRequest à functionX dans un service externe. À l'origine, le délai d'expiration de ce httpwebrequest était de 5 minutes. Récemment, le service externe a pris plus de 5 minutes pour répondre (ce que je suis d'accord). Donc, j'ai passé le httpWebRequest.timeout jusqu'à 10 minutes. Pendant ce temps, le service wcf devrait pouvoir traiter d'autres demandes entrantes (à la fonction B, à la fonctionC, etc.). Ce que je vis maintenant est que si la fonctionX prend plus de ~ 5 minutes pour répondre (et donc que functionA dure plus de 5 minutes), les requêtes suivantes à la fonctionB dans mon service wcf sont mises en file d'attente/ne traitent pas jusqu'à la fin de functionA. En fin de compte, tout se termine correctement, mais je ne vois pas pourquoi la fonction B est affectée par l'attente qui se passe dans la fonction A. Pardonnez-moi si c'est difficile à suivre. C'est étrange et j'ai de la difficulté à envelopper la tête de la façon dont ces pièces sont liées.wcf service long httpwebrequest wait provoque la mise en file d'attente des demandes suivantes

Répondre

1

Vous devez décorer votre WCF classe de service avec attribut suivant

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] // The service instance is multi-threaded. 
public class Service1 
{ 
    // ... 
} 

Je suppose que votre mode est réglé sur concurrency unique défini comme suit par Microsoft.

« L'instance de service est mono-thread et n'accepte pas les appels rentrants. Si la propriété est System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode System.ServiceModel.InstanceContextMode.Single et des messages supplémentaires arrivent alors que l'instance services d'un appel, ces messages doivent attendre que le service soit disponible ou jusqu'à ce que les messages expirent. "

0

J'ai eu le même problème. J'ai hébergé mon service dans IIS. après peu de recherche je l'ai découvert à cause de maxconnection limite dans la configuration web. i ajouté cette ligne à mon web.config et le problème résolu:

<system.net> 
    <connectionManagement> 
     <add address="*" maxconnection="1000"/> 
    </connectionManagement> 
</system.net> 

par défaut la valeur est maxconnection 2. mais est l'une des nombreuses raisons. vous devriez surveiller vos demandes de serveur afin de trouver la raison exacte.