2017-10-20 24 views
0

J'ai créé un service WCF simple dans Visual Studio 2017, .NET 4.5. (Ajouter un nouvel élément -> Service WCF). Il a changé le web.config et défini le aspNetCompatibilityEnabled sur true. Ainsi, le service s'exécute en mode de compatibilité ASP.NET.Le service WCF OneWay ralentit lorsque aspNetCompatibilityEnabled est défini sur false

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
    multipleSiteBindingsEnabled="true" /> 

Le service a une méthode OneWay:

[OperationContract(IsOneWay = true)] 
void DoWork(); 

La mise en œuvre ressemble à ceci:

public void DoWork() 
{ 
    var threadId = Thread.CurrentThread.ManagedThreadId; 
    Debug.WriteLine("Starting..." + threadId); 
    Thread.Sleep(TimeSpan.FromSeconds(30)); 
    Debug.WriteLine("Finished..." + threadId); 
} 

Cela fonctionne comme prévu. On peut envoyer des demandes et ensuite retourner immédiatement sans et répondre. Je peux envoyer beaucoup de demandes et revenir immédiatement.

Cependant, si je change aspNetCompatibilityEnabled="false" et mis

[AspNetCompatibilityRequirements(
RequirementsMode = AspNetCompatibilityRequirementsMode.NotAllowed)] 

sur la classe de service, le service ralentit. Il ne peut gérer que 3 demandes et le 4ème attend. Le service ne revient pas sans une réponse immédiatement. On dirait qu'il ne peut gérer que 3 requêtes à la fois.

Qu'est-ce qui explique ce comportement? Chaque paramètre est la valeur par défaut, rien de spécial n'est défini dans web.config.

+0

était le service plus rapide et était-il gérer plus de 3 demandes avant de la aspNetCompatibility false – BipinR

+0

Oui, exactement, c'est le point. –

Répondre

1

Si votre application est hébergée dans IIS et si vous définissez le aspNetCompatibilityEnabled='false', les requêtes ne circuleront pas dans le pipeline HTTP ASP.NET. L'une des raisons de ce ralentissement pourrait être que, puisque les requêtes ne tirent pas parti du pipeline, IIS met un certain temps à exécuter les scripts nécessaires pour recevoir et transmettre la requête à WCF. Par défaut, WCF traite uniquement une requête à la fois jusqu'à ce que vous spécifiez un niveau de concurrence différent. Les autres demandes doivent attendre que la demande précédente soit traitée. C'est le pipeline HTTP ASP.NET qui contient la file d'attente de requêtes et la traite une à la fois. Je crois dans ce cas que l'avantage de pipeline HTTP ASP.NET est perdu le pipeline non ASP.NET ne gère pas correctement la file d'attente des demandes. J'espère que cela répond à vos questions. Certains documents supplémentaires à ce sujet sont mentionnés ci-dessous

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/wcf-services-and-aspnet

https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/wcf/servicehostingenvironment

+0

Est-il sûr de désactiver 'aspNetCompatibilityEnabled', ce qui peut mal tourner? –

+0

Il est sûr de désactiver la compatibilité, mais regardez les différentes options de limitation WCF si vous souhaitez traiter plusieurs demandes en même temps. – BipinR