Service Web ASMX lente première demande
J'ai un tas de .NET, Webservices cours d'exécution dans une Application IIS. Ces services web sont utilisés par une autre Application IIS (frontend). Le premier appel est assez lente, environ 5 à 10 secondes. Après c'est juste millisecondes. Le premier appel est considéré comme un problème de performance.
Nous avons essayé une application qui appelle tous ces webservices, mais ce n'est évidemment pas résoudre quoi que ce soit. Il n'est donc pas l'Application par défaut Recycler c'est bien le problème. J'ai créé une application qui vient initialise le service plusieurs fois et mesure le temps qu'il faut pour créer une instance. Avant d'exécuter cette application je m'assurer que mon webservice application est démarrée /recyclé, puis-je exécuter l'application. La première initialisation prend entre 2 à 4 secondes, tous les autres est juste millisecondes.
Une autre pensée, c'est que nous avons créer une page dans l'Interface de l'application qui lance tous les webservices et que nous appelons cette page avant tout les utilisateurs sont en. Je ne considère pas cela comme une solution élégante, quoi d'autre pourrais-je essayer?
- Ce qui se passe dans le site initializiation?
Vous devez vous connecter pour publier un commentaire.
Le retard que l'on ressent lorsqu'un client est d'appeler un webservice pour la première fois est causé par le fait que, par défaut, un XmlSerializers dll pour le webservice doit être compilé. Ceci est à l'origine de 2 à 4 secondes pour que l'appel initial. Bien sûr, cela est le cas lorsque le service web application est déjà en cours d'exécution, si ce n'est pas que vous auriez un recyclage. Dans ce cas, les autres réponses pourraient vous aider.
Pour accélérer l'appel initial, vous pouvez créer le XmlSerializers dll au moment de la compilation. Vous pouvez le faire en mettant en place votre projet de construction "Générer l'assembly de sérialisation" pour sur. Cela génère une MyApplication.XmlSerializers.dll contenant le webservice de l'information. Maintenant l'appel initial a chuté à 300 ms, sans doute que le chargement de la dll. Tous les appels après prendre 0 ms.
Dans Visual Studio, cliquez droit sur votre projet et choisissez "Propriétés". Aller à la "Construction" de l'Onglet. Là, vous avez une option "Générer l'assembly de Sérialisation" dans la "Sortie" de la section. Si vous modifiez la valeur de " On " l'assembly de sérialisation sera généré lors de la compilation.
La première fois que vous appelez le webservice, ou la première fois après un long délai, le service web doit démarrer. C'est là que vous avez vu le retard. Après ça, c'est déjà commencé et va répondre très rapidement à des appels. C'est la norme de service web comportement.
Vous pouvez configurer IIS pour avoir keepalive = vrai - ce qui peut améliorer les performances.
Plus d'informations sur demande.
Il se pourrait que la sérialisation des assemblées sont en cours de création au moment de l'exécution. Vous pouvez modifier les paramètres de l'assembly de sérialisation à l'aide de la liste déroulante au bas de la Construire volet de la fenêtre de propriétés du projet.
Il pourrait être que vous avez écrit votre service web pour effectuer beaucoup d'opérations sur le démarrage de l'application, qui permettrait de se passer la première fois une méthode sur le service est appelé.
Il se peut que l'opération est très lente, mais vous êtes alors en cache la réponse, ce qui rend les appels ultérieurs plus rapide.
J'ai récemment découvert que dans notre ASMX-fichiers, nous avons mentionné que le nom de la classe. Nous avons obtenu la mise en œuvre des services dans un montage différent pour chaque ASMX-fichier. Cela provoque .NET framework pour parcourir l'ensemble du bin-dossier à la recherche de l'assembly contenant la mise en œuvre. Comme votre webservice application grossit, cela consomme plus de temps.
Ce problème peut être résolu par pas seulement, y compris le nom de la classe dans votre ASMX définition, mais aussi le nom de l'assembly.
Notre ASMX ressemblait à ceci:
<%@ WebService Language=”C#” CodeBehind=”MyService.cs” Class=”MyWebservice” %>
Si vous changer pour inclure l'assembly qui contient la mise en œuvre, il devrait ressembler à ceci. Cela nous a sauvé environ 10% de notre charge initiale de la webservice application.
<%@ WebService Language=”C#” CodeBehind=”MyService.cs” Class=”MyWebservice, MyWebservice.Implementation.Assembly” %>
Qui est typique, depuis ASP.NET apps compiler et charger le bin\ répertoire dans la mémoire, à la première demande.
Choses à faire en premier:
Supprimer les dll dans votre répertoire bin. (J'ai vu des gens navire nunit.dll)
Précompiler votre ASP.NET application de sorte qu'IIS n'a pas besoin d'. Voir "VS 2008 Projet de Déploiement Web de Soutien Publié"
Ne sais pas si cela va résoudre lente rotation de la WS sur la "première fois", comme, je suppose, est une charge de la compilation et de la .net DLL est en cours de chargement, mais vous pouvez presque éliminer tout les futurs démarrages à froid en veillant à l'application de la piscine le WS est en est configuré correctement.
Par défaut, IIS6 a "respawn" le repos, et après un nombre de minutes ou de "recycler" les événements qui effectivement redémarrer le WS à chaque fois. Si votre heureux le service est stable, alors elles ne sont pas nécessaires.
Veiller à ce que le WS a son propre pool d'applications dédié (ne partage pas inadapté à la piscine) est également une recommandation forte.
Après plusieurs heures de fou essais, i a été en mesure de réduire le webservice de la première exécution temps d'exécution minimum de deux dans la même classe d'IP (ci-dessous 300msec)....
J'ai vécu au premier abord, un premier délai de 2-3 sec au premier webservice appel, que tout appel ultérieur à partir du même processus d'être très rapide.
La clé pour la compréhension du retard dans mon cas a été client de poignées de PROXY WEB !!
C'est ma nouvelle liaison dans l'app.fichier de configuration:
La première webcall exécution, je suppose, beaucoup plus lent en raison de canal de transport nécessaires pour découvrir la configuration du proxy lors de l'initialisation, afin de connecter de manière transparente à l'internet. Ce n'est généralement pas nécessaire dans l'intranet de l'environnement, donc j'ai changé ces paramètres de liaison afin d'éviter l'utilisation de proxy par défaut (automatiquement découvert à partir des paramètres de l'explorateur):
bypassProxyOnLocal="false"
useDefaultWebProxy="false"
La première demande des temps de connexion est maintenant réduit par une grande quantité.
Espérons que cette aide.
Désolé pour le nécro ajouter, mais cela a été une lutte constante pour moi aussi, et je voulais ajouter quelques informations à l'image. VisualStudio elle-même ajoute un assez grand nombre de composants à la fois. Voici le test de base, impliquant un bare-bones formulaires d'application et d'un déjà en cours d'exécution webservice hébergé en interne sur un serveur de l'entreprise (avec Générer l'Assembly de Sérialisation définie sur true pour tous les tests):
Histoire courte? Visual Studio est l'ajout d'un grand morceau de temps pour la photo. Au lieu de ~90 ms, c'est près d'une seconde. Donc, si vous êtes en train de faire le réglage des performances, assurez-vous de faire vos tests à l'extérieur de la VisualStudio environnement.