Zunächst einmal verstehe ich, dass es eine schreckliche Idee ist, extrem große/lang laufende Berichte zu erstellen. Ich bin mir bewusst, dass Microsoft eine Faustregel hat, die besagt, dass ein SSRS-Bericht nicht länger als 30 Sekunden für die Ausführung benötigen sollte. Manchmal sind jedoch gigantische Berichte ein bevorzugtes Übel aufgrund äußerer Zwänge, wie z. B. die Einhaltung von staatlichen Gesetzen.
An meinem Arbeitsplatz haben wir eine asp.net (2.0) Anwendung, die wir von Crystal Reports zu SSRS migriert haben. Aufgrund der großen Benutzerbasis und der komplexen Anforderungen an die Benutzeroberfläche für die Berichterstattung haben wir eine Reihe von Bildschirmen, die vom Benutzer eingegebene Parameter akzeptieren und Zeitpläne erstellen, die über Nacht ausgeführt werden. Da die Anwendung mehrere Reporting-Frameworks unterstützt, nutzen wir die Scheduling-/Snapshot-Funktionen von SSRS nicht. Alle Berichte im System werden von einer geplanten Konsolenanwendung generiert, die vom Benutzer eingegebene Parameter entgegennimmt und die Berichte mit den entsprechenden Berichtslösungen generiert, mit denen die Berichte erstellt wurden. Im Falle von SSRS-Berichten generiert die Konsolenanwendung die SSRS-Berichte und exportiert sie als PDF-Dateien über die SSRS-Webdienst-API.
Bisher war SSRS viel einfacher zu handhaben als Crystal, mit Ausnahme eines bestimmten 25.000-Seiten-Berichts, den wir kürzlich von Crystal Reports auf SSRS umgestellt haben. Der SSRS-Server ist ein 64-Bit 2003-Server mit 32 Gigabyte Arbeitsspeicher, auf dem SSRS 2005 läuft. Alle unsere kleineren Berichte funktionieren fantastisch, aber wir haben Probleme mit unseren größeren Berichten wie diesem hier. Leider können wir den oben genannten Bericht nicht über die Webdienst-API erstellen. Der folgende Fehler tritt etwa 30-35 Minuten nach der Generierung/Export auf:
Ausnahmemeldung: Die zugrunde liegende Verbindung wurde geschlossen: Bei einem Empfang ist ein unerwarteter Fehler aufgetreten.
Der Aufruf des Webdienstes ist etwas, das Sie sicher alle schon einmal gesehen haben:
data = rs.Render(this.ReportPath, this.ExportFormat, null, deviceInfo,
selectedParameters, null, null, out encoding, out mimeType, out usedParameters,
out warnings, out streamIds);
Das Seltsame ist, dass dieser Bericht ausgeführt/gerendert/exportiert wird, wenn der Bericht direkt auf dem Berichtsserver mit dem Berichtsmanager ausgeführt wird. Der Prozess, der die Daten für den Bericht erzeugt, läuft etwa 5 Minuten lang. Der Bericht wird im nativen SSRS-Format im Browser/Viewer nach etwa 12 Minuten dargestellt. Das Exportieren in das PDF-Format über den Browser/Viewer im Berichtsmanager dauert weitere 55 Minuten. Dies funktioniert zuverlässig und erzeugt eine satte 1,03gb pdf.
Hier sind einige der offensichtlichen Dinge, die ich ausprobiert habe, um den Bericht über die Webdienst-API zum Laufen zu bringen:
- die HttpRuntime ExecutionTimeout festlegen Wert auf 3 Stunden für den Bericht Server
- deaktiviert http keep alives auf dem Berichtsserver
- die Skript-Zeitüberschreitung auf dem Berichtsserver erhöht
- den Bericht so einstellen, dass er auf dem Server nie abläuft
- die Zeitüberschreitung für den Bericht beim Client-Aufruf auf mehrere Stunden einstellen
Nach den Änderungen, die ich ausprobiert habe, kann ich mit ziemlicher Sicherheit sagen, dass alle Zeitüberschreitungsprobleme beseitigt wurden.
Ausgehend von meiner Forschung der Fehlermeldung, glaube ich, dass die Webdienst-API nicht standardmäßig chunked Antworten senden. Dies bedeutet, dass es versucht, alle 1,3 GB über die Leitung in einer Antwort zu senden. An einem bestimmten Punkt wirft der IIS das Handtuch. Leider abstrahiert die API die Webdienstkonfiguration, so dass ich keine Möglichkeit finde, das Chunking von Antworten zu aktivieren.
- Weiß jemand, wie man die PDF-Exportphase und/oder die Größe der PDF-Datei reduzieren/optimieren kann, ohne die Gesamtseitenzahl zu verringern?
- Gibt es eine Möglichkeit, das Response Chunking für SSRS zu aktivieren?
- Hat jemand andere Theorien, warum dies auf dem Server läuft, aber nicht über die API?
EDIT: Nachdem ich den Beitrag von kcrumley gelesen hatte, begann ich, die durchschnittliche Seitengröße anhand der Dateigröße/Seitenzahl zu ermitteln. Interessanterweise ergibt die Rechnung bei kleineren Berichten, dass jede Seite etwa 5K groß ist. Interessanterweise erhöht sich dieser "Durchschnitt", wenn der Bericht größer wird. Bei einem Bericht mit 8000 Seiten beispielsweise liegt der Durchschnitt bei über 40K/Seite. Sehr merkwürdig. Ich möchte noch hinzufügen, dass die Anzahl der Datensätze pro Seite mit Ausnahme der letzten Seite in jeder Gruppierung festgelegt ist, es ist also nicht so, dass einige Seiten mehr Datensätze haben als andere.