Tout d'abord, je comprends que c'est une idée horrible d'exécuter des rapports extrêmement longs/longs. Je suis conscient que Microsoft a une règle de base indiquant qu'un rapport SSRS ne devrait pas prendre plus de 30 secondes à exécuter. Cependant, parfois les rapports gargantuesques sont un mal préféré en raison de forces externes telles que la conformité avec les lois de l'État.Optimisation de l'exportation PDF d'énormes rapports dans Sql Reporting Services 2005
A mon lieu de travail, nous avons un asp.net (2.0) application que nous avons migré de Crystal Reports à SSRS. En raison de la grande base d'utilisateurs et des exigences complexes de l'interface utilisateur de reporting, nous avons un ensemble d'écrans qui accepte les paramètres saisis par l'utilisateur et crée des plannings à exécuter pendant la nuit. Puisque l'application prend en charge plusieurs cadres de reporting, nous n'utilisons pas les fonctionnalités de planification/snapshot de SSRS. Tous les rapports dans le système sont générés par une application de console planifiée qui prend les paramètres entrés par l'utilisateur et génère les rapports avec les solutions de génération de rapports correspondantes avec lesquelles les rapports ont été créés. Dans le cas des rapports SSRS, l'application console génère les rapports SSRS et les exporte en tant que fichiers PDF via l'API du service Web SSRS.
Jusqu'à présent SSRS a été beaucoup plus facile à traiter que le cristal à l'exception d'un certain rapport 25 000 pages que nous avons récemment converti des rapports de cristal à SSRS. Le serveur SSRS est un serveur 64 bits 2003 avec 32 Go de RAM exécutant SSRS 2005. Tous nos plus petits rapports fonctionnent de manière fantastique, mais nous avons des problèmes avec nos rapports plus volumineux comme celui-ci. Malheureusement, nous ne pouvons pas générer le rapport susmentionné via l'API du service Web. L'erreur suivante se produit environ 30 à 35 minutes dans la génération/export:
Message d'exception: La connexion sous-jacente a été fermée: Une erreur inattendue est survenue sur une réception.
L'appel de service Web est quelque chose que je suis sûr que vous avez tous vu:
data = rs.Render(this.ReportPath, this.ExportFormat, null, deviceInfo,
selectedParameters, null, null, out encoding, out mimeType, out usedParameters,
out warnings, out streamIds);
La chose étrange est que ce rapport courra/render/exportation si le rapport est exécuté directement sur le serveur de rapports en utilisant le gestionnaire de rapports. Le processus qui produit les données pour le rapport dure environ 5 minutes. Le rapport s'affiche au format natif SSRS dans le navigateur/visualiseur après environ 12 minutes. L'exportation en pdf via le navigateur/visualiseur dans le gestionnaire de rapports prend 55 minutes supplémentaires. Cela fonctionne de manière fiable et il produit un énorme pdf de 1,03 Go.
Voici quelques-unes des choses les plus évidentes, j'ai essayé d'obtenir le rapport de travail via l'API de service Web:
- définissez les HttpRuntime ExecutionTimeout valeur à 3 heures sur le rapport serveur
- désactivé http garder alive sur le serveur de rapports
- a augmenté le délai d'attente de script sur le serveur de rapports
- mis le rapport en temps jamais sur le serveur
- définir le délai de rapport à plusieurs heures sur l'appel client
Des coups secs que j'ai essayé, je suis assez à l'aise de dire que tous les problèmes de délai d'attente ont été éliminés.
En fonction de mes recherches sur le message d'erreur, je crois que l'API de service Web n'envoie pas de réponses fragmentées par défaut. Cela signifie qu'il essaie d'envoyer tous les 1,3 Gb sur le fil en une seule réponse. À un moment donné, IIS jette l'éponge. Malheureusement, l'API fait abstraction de la configuration du service Web, de sorte que je n'arrive pas à trouver un moyen d'activer la segmentation des réponses.Est-ce que quelqu'un sait de toute façon réduire/optimiser la phase d'exportation PDF et/ou la taille du PDF sans réduire le nombre total de pages?