7
votes

WCF à la liaison ASMX beaucoup plus lente renvoyant de grandes données que la référence Web standard

Je lie un service Web ASMX existant à l'aide d'une référence de service WCF. J'ai une méthode qui renvoie un objet de jeu de données contenant une chaîne de longueur de 500K.

comme une référence Web standard "vieille école", appeler cette méthode prend environ 2-3 secondes à compléter. En tant que référence de service WCF, cela prend plus de 20 secondes à compléter. Cela a un impact sur nos systèmes maintenant: (

J'ai essayé de modifier les liaisons pour maximiser tous les maxReceEvedMessagesize et MaxbyteSperread, etc., mais cela n'a fait aucune différence.

Pourquoi la référence WCF est-elle tellement plus lente et que puis-je faire pour résoudre ce problème?


3 commentaires

Quelle est la taille du message transmis avant et après? La première chose à comprendre est de savoir si c'est une bande passante liée à la bande passante VS Traitement des frais généraux (Sécurité, etc.). 500k n'est pas déraisonnable.


Avez-vous essayé de regarder le traçage WCF (pour le client) et des journaux IIS (pour le serveur) pour voir où le temps est pris? On dirait que c'est au client, mais serait bon pour réduire la zone de problèmes.


En outre, le ralentissement est-il vu sur chaque appel ? Si vous appelez le service 10 fois de suite, est-ce la même performance à chaque fois?


3 Réponses :


0
votes

Vous devez examiner un certain nombre d'aspects, notamment que vous comparez comme pour comme en termes de quantités de données. Il se peut qu'il y ait d'autres facteurs qui ont provoqué le ralentissement.

Ma première question serait pourquoi l'avez-vous changé en WCF? Y a-t-il une raison spécifique à cela - je sais que c'est la bonne façon d'y aller, mais existe-t-il une raison spécifique qui signifiait que cela devait être changé maintenant? Y a-t-il eu des modifications à l'interface qui auraient pu avoir de larges effets variés.

La WCF est susceptible d'être légèrement plus lente, à cause du traitement de l'objet, mais il ne faut pas avoir rien de tel que cette différence. Qui ferait tous pointer quelque chose d'autre dans l'environnement étant le vrai problème.


2 commentaires

Cela n'a pas été changé, il a toujours été une référence WCF, la référence Web a été ajoutée pour tester la vitesse car nous disposons d'autres applications qui téléchargent les mêmes données du même service Web sans aucun problème de vitesse. J'aimerais ajouter que ce service Web vivait derrière un certificat SSL sur HTTPS.


OK, certaines des parties de l'interface vont ralentir des trucs (WCF et SSL), mais pas de manière significative, à moins que vous traitez des quantités très substantielles de données. Cela indiquerait un changement environnemental. Pouvez-vous exécuter les tests avec les nouvelles et les méthodes de la vieille école et de la nouvelle école et de comparer des temps. Ensuite, je suggérerais que l'accès à la base de données est identique. Il n'y a pas de réponse simple et il ne devrait pas y avoir cette différence, vous devrez donc poursuivre pour identifier où vient le problème du problème.



0
votes

Quel type de liaison est utilisé? Il y a le BasichttpLinding et WshttpLinding et simuler un ASMX, BasichttpLinding est recommandé. En général, WCF devrait être au moins comparable à leur contrepartie ASMX. Si cela n'aide pas, essayez de modifier les paramètres de concurrence et les modes d'instanciation pour la WCF.


1 commentaires

Il ne peut pas se lier à un service ASMX existant avec WSHTTPTPLINDING sur un client. Il est évident qu'il utilise BasichttpLinding.



2
votes

Il semblerait qu'il y a quelques problèmes ici.

  1. Premier, les services de la WCF, étant sotculeux, sauf configuration contraire, doivent être activés sur chaque nouvelle connexion. Cette activation est ralentie par SSL en raison de voyages supplémentaires pour l'authentification. Comme l'une des questions / suggestions a conduit ci-dessus, essayez de faire la connexion initiale, puis de tenter d'exécuter la méthode 10 fois environ et de mesurer le temps nécessaire pour les appels ultérieurs, cela devrait être beaucoup plus rapide après l'appel initial. En fait, Selon MS , WCF est plus efficace dans la manipulation des appels que la "vieille école" asmx, mais est toujours soumise à un temps d'activation.

  2. Ensuite, WCF a une action de sérialisation folle qui se produit en arrière-plan et ne joue pas bien avec un objet de jeu de données, en raison des quantités insensées de frais généraux et de métadonnées que l'objet DataSet a. Si un ensemble de données plus grand doit être utilisé, vous devez modifier la sérialisation du flux en MTOM ou Binary (mais cela ne fonctionne que si vos clients sont également basés sur WCF / .NET). L'autre option ne serait pas d'utiliser des jeux de données, ce qui est probablement la meilleure option en matière de WCF. ici est un lien vers un article intéressant sur la vitesse des jeux de données sérialisés .

    Un article supplémentaire sur la raison pour laquelle vous ne devez pas utiliser de jeux de données.

    ref:

    http://msdn.microsoft.com/en-us/library/ BB310550.ASPX

    http://blogs.microsoft.co.il/blogs/oshvartz/archive/2011/07/23/wcf-performance-utilisateur-DataSets-Part-2.aspx

    http://www.haselman.com/blog/returningdatasetsfromwetanserviesSisTheeswawnofsatanandrePresentsAltHatistrulyEvilintHeweworld.aspx << / p>


1 commentaires

En fait, le travail de tout le monde qui utilise débordement de pile est d'améliorer constamment les questions et les réponses. Merci d'améliorer votre réponse.