2009-07-07 8 views
3

Ich habe eine "einfache" Aufgabe. Ich habe ein bestehendes Projekt mit einem in C# geschriebenen Webdienst, der eine Methode hat, die eine riesige XML-Datei an den Client sendet. (Dies ist eine Sicherungsdatei mit Daten, die auf dem Server gespeichert sind und an eine andere Stelle gesendet werden müssen.) Für diesen Dienst wurden außerdem einige zusätzliche Authentifizierungs-/Autorisierungseinstellungen eingerichtet. Und ich habe eine vorhandene Delphi 2007-Anwendung für WIN32, die den Webdienst aufruft, um die XML-Daten für die weitere Verarbeitung zu extrahieren. Es ist ein Legacy-System, das ohne .NET-Installation ausgeführt wird. Einziges Problem: Die XML-Datei ist riesig (mindestens 5 MB) und muss als Ganzes gesendet werden. Aufgrund der Systemanforderungen kann ich das nicht einfach in mehrere Teile aufteilen. Und ich darf weder den C# - noch den Delphi-Code wesentlich ändern. (Ich kann den Methodenaufruf nur auf Client und Server ändern.) Und ich darf nicht mehr als 8 (Arbeits) Stunden damit verbringen, eine bessere Lösung zu finden, sonst bleiben die Dinge einfach unverändert.Senden eines binären Datenstroms durch SOAP

Die Änderung, die ich hinzufügen möchte, besteht darin, die XML-Daten zu komprimieren (was sie auf etwa 100 KB reduziert) und sie dann als binären Stream an den Client zu senden. Der Delphi-Code sollte dann diesen eingehenden Stream akzeptieren und die XML-Daten erneut komprimieren. Nun, mit einem Minimum an Änderungen am bestehenden Code, wie soll dies geschehen?

(Und ja, ich schrieb den ursprünglichen Client und Server in der Vergangenheit und es war nie so viele Daten auf einmal zu senden. Leider hatte der Entwickler, der es von mir übernahm, andere Ideen, machte einige dumme Änderungen, Ich habe mehr Schaden angerichtet und die Firma verlassen, bevor sich mein Stahlspitzenboot mit seinem Hintern verbinden konnte. Jetzt muss ich ein paar Dinge reparieren. Die Reparatur dieses Webdienstes hat eine sehr geringe Priorität im Vergleich zu den anderen Schäden, die wiederhergestellt werden müssen


Der Servercode basiert auf altem ASMX-Code, der Clientcode ist das Ergebnis des Delphi-SOAP-Imports mit einigen zusätzlichen Modifikationen. Das XML ist ein tägliches Update für die mehr als 3000 Benutzer, die in ihrem aktuellen Design riesig sind. Wir arbeiten daran, aber das braucht Zeit. Es gibt wichtigere Punkte, die zuerst behoben werden müssen, aber wie gesagt, es ist nur wenig Zeit verfügbar, um dieses Problem schnell zu beheben.

+0

Sie haben nicht gesagt, ob Sie WCF oder die ältere ASMX-Technologie verwenden. –

+0

Warum sichern Sie nicht einfach diese XML-Datei, wenn Sie die restlichen Dateien des Servers sichern? Warum behandeln Sie es besonders? Sie * sichern * den Server, nicht wahr? –

Antwort

4

Das klingt wie ein guter Kandidat für eine Httphandler

Meine gute Links auf meinem Computer sind (Ich werde sie hinzufügen, wenn ich zur Arbeit zu kommen), aber man kann, wenn es eine gute sein wird, um zu sehen passen.

- Bearbeiten -
Hier sind die Links ...

http://www.ddj.com/windows/184416694
http://visualstudiomagazine.com/articles/2006/08/01/create-dedicated-service-handlers.aspx?sc_lang=en&sc_mode=edit

+0

Hört sich gut an, solange es schnell zu implementieren ist. :-) Ansonsten werde ich nicht die Zeit haben, die Modifikation vorzunehmen. (Zu viele wichtigere Probleme, die zuerst behoben werden müssen.) –

+0

Jetzt brauche ich nur noch etwas für die Client-Seite, um diesen Stream zu verarbeiten. (Und ich hoffe, es ist einfach in Delphi/WIN32 zu implementieren.) –

+0

Und ich fand es! :-) Benutze einfach die URL um die Seite herunterzuladen. Zumindest ist es besser als der aktuelle Service ... –

1

Was ist das Problem mit einer 5 MB-Datei in einer SOAP-Nachricht ist? Ich habe einen Dokumentenserver geschrieben, der über Seife läuft und dieser Server hat kein Problem mit großen Dateien.

Wenn die Größe ein Problem für Sie ist, würde ich nur die XML-Daten komprimieren und dekomprimieren. Dies kann leicht mit einer der vielen (freien) verfügbaren Komponenten zur Komprimierung eines TStream-Nachfahrers erfolgen.

+0

Das Problem ist, dass die Client-Anwendung auf einem einfachen Netbook mit einem GPRS-whatever Wireless-Netzwerk bei 7MBits installiert werden kann. Mit dem zusätzlichen Overhead für Firewalls, Virenscanner und die möglichen schlechten Verbindungen müssten unsere "Feldagenten" lange warten, bis sie ihr tägliches Update erhalten ... –

0

Wenn Sie diese Art von Komprimierung erhalten, konvertieren Sie einfach jedes Byte in seine Hexadezimaläquivalent, die nur die Größe verdoppelt, und senden Sie dies. Dann mache das Gegenteil am anderen Ende. Oder fehlt mir etwas?

+0

Ja, das würde auch funktionieren, obwohl das aktuelle Komprimierungsniveau noch nicht erreicht ist. t garantiert. Angesichts der begrenzten Bandbreite der Endnutzer ist es umso besser, je weniger Daten gesendet werden müssen. Bin schon froh, dass kein Benutzer eine alte DFÜ-Verbindung benutzt. –

0

Ich würde mit Brad Bruce zustimmen, HttpHandler wäre schnell, und mit GZIP oder Deflate Compression mit könnte ich mich irren ... Browser-Unterstützung nativ. Sie können leicht große Komprimierung auf Text-basierte Daten für billige CPU-Zeit bekommen.

System.IO.Compression.GZipStream GZipStream = new System.IO.Compression.GZipStream("Your XML Doc Stream",System.IO.Compression.CompressionMode.Compress) 
Verwandte Themen