2009-08-20 7 views
1

Ich arbeite an einem Produkt, das MS Word-Ausgabe erstellt, indem ein HTML-Dokument mit den entsprechenden Bits von Word-CSS und XML-Magie in es eingebettet generiert. Ich muss jetzt RTF (Bilder und formatierter Text) in das Dokument einbetten und betrachte dabei die mehrteiligen HTML-Generierungsfunktionen in .NET.Multipart HTML und eingebettete Bilder von .NET ohne Festplattenzugriff?

Ich möchte das MHTML-Dokument generieren, indem Sie die RTF-Snippets in Bilder im Speicher konvertieren und dann einfach die Base64-codierten Daten direkt in das MHTML-Objekt einbetten. Bisher kann ich dafür keine .NET-Lösungen finden.

Die MS CDO stuff ist vielversprechend, aber es sieht so aus, als ob die einzige Möglichkeit zum Erstellen einer Anlage darin besteht, den Daten eine URL zuzuweisen und sie mit AddRelatedBodyPart() dem Objekt hinzuzufügen. Das System.Net.Mail-Paket sieht auch überzeugend aus (wie dokumentiert here und in einer vorherigen Frage here), aber ich sehe keine direkte Möglichkeit, das generierte Mail-Objekt in eine Zeichenfolge zu konvertieren - scheint die API zu sein sich auf das Senden von Mail-Nachrichten konzentrieren und keine Dateien generieren.

Im Moment treibe ich einen Ansatz vor, der CDO und temporäre Verzeichnisse verwendet, aber ich bin damit als langfristiger Ansatz unzufrieden. Irgendwelche besseren Vorschläge?

Antwort

1

Es gab nicht viel Nachfrage nach der Fähigkeit von System.Net.Mail, seine Ausgabe an irgendeine Art von Stream zu senden, der vom Benutzer definiert wurde, aber darüber wurde schon gesprochen. Kannst du mir mehr Informationen über dein Szenario geben? Ich würde gerne wissen, wie die Leute das verwenden, um diese Funktion hinzuzufügen.

Ich denke, Sie könnten Reflection verwenden, um den Ausgabestream von einem FileStream zu einem anderen Stream umzuleiten, bevor Sie die Nachricht senden. Der Großteil des Codes in System.Net.Mail verwendet Dekoratoren um Stream-Objekte herum. Ich vermute, dass dies möglich wäre, aber ich kenne die Reflektion nicht gut genug, um Ihnen einen guten Codeausschnitt zu geben. Außerdem verwendet System.Net.Mail einen eigenen base64-Encoder, so dass es schnell geht. Ich habe auch ein paar Dinge für .Net 4.0 optimiert, so dass Sie wahrscheinlich eine noch bessere Leistung davon bekommen, obwohl ich bezweifle, dass es bemerkbar wäre.

+0

Hintergrund: Ich muss Word (und bald, Excel) Ausgabe von einer Desktop-Anwendung generieren. MS Office bietet eine großartige Unterstützung für HTML + XML + CSS als Dateiformat. Wenn ich also ein sorgfältig gestaltetes HTML-Dokument erstellen kann, kann ich eine Word-Ausgabe generieren. Ich bevorzuge das Erstellen von nativer Word-Ausgabe aus einer Reihe von Gründen, nicht zuletzt, weil ich auch HTML-Ausgabe generieren muss. Word verarbeitet korrekt MHTML-Dateien, was eine gute Einzeldatei-Lösung für die Ausgabe mit eingebetteten Bildern darstellt. Also, ich möchte MHTML dynamisch zu einem Stream generieren, API-Aufrufe (keine Dateien) verwenden, um die Eingabe zu erstellen. –

+0

Danke für die Info. Wir hatten eine Menge Feedback von Leuten, die MHTML-Unterstützung in System.Net.Mail wollten und leider wird es nicht für .Net 4.0 hinzugefügt, aber es ist ziemlich hoch auf der Liste der Funktionen für zukünftige Versionen von System.Net.Mail.Ich werde Ihrem PM Informationen zu Ihrem Szenario geben. –

+0

Update: Unser Team verfolgt diese Anfrage offiziell für zukünftige Entwicklungen, so dass dies in der Zukunft für System.Net.Mail unterstützt wird. Überprüfen Sie das NCL-Blog (blogs.msdn.com/ncl) auf Updates für diese und andere neue Funktionen. –

0

Die Unterstützung für Base64-Codierung in .NET ist nicht sehr schnell und System.Net.Mail ist nicht universell. Ich wendete mit CHilkat S/MIME und es hat gut funktioniert.

+0

Eigentlich System.Net.Mail verwendet seine eigene Base64-Codierung und es ist viel schneller nach unseren Perf-Tests. Es ist auch ein ziemlich allgemeiner Zweck, aber ich gebe zu, dass es einige Mängel gibt. –

+0

Jeff, ich habe nur die Implementierung von Convert.ToBase64String überprüft, und es sieht so aus, als ob du richtig liegst: Es rollt die innere Schleife richtig ab, also sollte es schnell sein. Das Seltsame ist, dass ich mich an eine native .NET Base64-Konvertierungsmethode erinnere, die das nicht getan hat, aber ich weiß nicht wo. Ist das frühkindliche Altzheimers oder kannst du dir vorstellen, wo es sein könnte? –

Verwandte Themen