Migration
Doconut.NETFramework 26.8.0 (.NET Framework 4.7) zu 26.9.0 (.NET Framework 4.7.2)
Diese Seite behandelt das Upgrade einer bestehenden ASP.NET-Anwendung von Doconut.NETFramework 26.8.0 oder früher (.NET Framework 4.7) auf 26.9.0 und später (.NET Framework 4.7.2). Das Doconut‑Beispielpaket enthält den vollständigen Migrationsleitfaden und die klassischen Beispiele, die auf die neue API portiert wurden – MVC 5, eine Webfarm und Web Forms. Einen Vergleich Ihrer Anwendung mit dem Ausgangsbeispiel durchzuführen ist der schnellste Weg.
Ein Paket, zwei Versionen
Beide Bibliotheken werden unter derselben Paket-ID veröffentlicht, Doconut.NETFramework. Die Version unterscheidet sie:
| Version | Ziel | API |
|---|---|---|
| 26.8.0 und früher | .NET Framework 4.7 | die vorherige API |
| 26.9.0 und später | .NET Framework 4.7.2 | die neue API |
Das Aktualisieren des Pakets ist das Upgrade. Es gibt kein separates Paket zur Installation und keine Kompatibilitätsschicht: 26.9.0 hat eine andere API-Oberfläche, erwarten Sie also nach dem Update Compilerfehler – siehe den Rest dieser Seite. Die .NET Framework‑4.7‑Linie ist eingestellt und 26.8.0 ist ihr letzter Release. Sie können dabei bleiben – hier gibt es keinen Sicherheitsfix, den Sie verpassen würden – aber neue Releases, Plugins, der verteilte Modus und die Drop‑In‑Widgets erscheinen nur in 26.9.0 und später.
1. Zielplattform ändern und Paket aktualisieren
Zielen Sie das Webprojekt zuerst auf .NET Framework 4.7.2 aus: Ein Projekt, das noch 4.7 anvisiert, kann 26.9.0 nicht installieren, und NuGet verweigert das Update. Aktualisieren Sie dann Doconut.NETFramework und fügen Sie die von Ihnen verwendeten Plugin‑Pakete hinzu (Doconut.NETFramework.Converter, Doconut.NETFramework.Dicom, …). Jedes Plugin benötigt eine Lizenz, die es gewährt.
Wenn das Projekt packages.config verwendet, führt das Update den Deinstallationsschritt der vorherigen Version aus, der den DocImage‑Handler aus Web.config entfernt, und 26.9.0 fügt ihn nicht wieder hinzu. Registrieren Sie ihn erneut wie in Schritt 3 gezeigt; bis Sie das tun, liefert DocImage.axd 404 und es wird keine Seite gerendert.
2. Namespaces: fast alles in den Root verschoben
| Vorher | Jetzt |
|---|---|
using Doconut.Configs.View; | using Doconut; |
using Doconut.Models; | using Doconut; |
using Doconut.Configs; | using Doconut; |
using Doconut.Configs.Cloud; | using Doconut.Clouds; |
using Doconut.Configs.Conversion; | unverändert |
Typnamen haben sich nicht geändert: WordConfig, PdfConfig, ExcelConfig, CssConfig, ScriptConfig, FileShareConfig und der Rest ist weiterhin vorhanden. In den meisten Dateien besteht die gesamte Änderung darin, Zeilen mit using zu löschen.
3. Startup: DoconutHost.Initialize und zwei Web.config‑Einträge
Das klassische Paket erstellte seinen Viewer pro Anforderung, wobei Optionen als Eigenschaften dieser Instanz bereitgestellt wurden. Das neue Paket hat einen Composition‑Root, der einmal in Application_Start gebaut wird, und der Viewer ist ein Service, den Sie auflösen:
// Vorher - Doconut.NETFramework 26.8.0 und früher, auf Anfrage
var viewer = new Viewer
{
ID = "ctlDoc",
IncludeJQuery = true,
BasePath = "/",
FitType = "width"
};// Doconut.NETFramework 26.9.0+ - Viewer aus DoconutHost aufgelöst, Lizenz einmal in DoconutHost.Initialize() konfiguriert
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { AllowSearch = true });DoconutHost.Initialize kommt in Application_Start und DoconutHost.Shutdown in Application_End, und Web.config erhält den DocImage.axd‑Handler und das Ressourcenmodul – beide finden Sie in Installation. Die pro‑Seite‑Erscheinungseinstellungen (FitType, FixedZoom, ShowHyperlinks, …) wurden vom Viewer‑Instanz zu den Optionen des Widgets verschoben, oder zu einem ViewerConfig, das an Viewer.RenderViewer übergeben wird (siehe ViewerConfig). new Viewer() kompiliert weiterhin, sobald DoconutHost.Initialize ausgeführt wurde, sodass migrierter Code‑Behind diese Zeile behalten kann, während Sie die Einstellungen verschieben.
Sicherheit funktioniert wie zuvor. Das Öffnen eines Dokuments gewährt der aktuellen ASP.NET‑Sitzung Zugriff auf dessen Seiten, und DocImage.axd verweigert allen anderen. Die DoconutUnSafeMode‑App‑Einstellung, die dies deaktivierte, ist jetzt options.UnsafeMode in DoconutHost.Initialize – lassen Sie sie false. Siehe Sitzungen & Sicherheit.
Der Startfehler, der die gesamte Seite zum Absturz bringt. Ein registriertes Plugin, dessen Fähigkeit keine Lizenz gewährt, wirft in
Application_Start, und die Anwendung liefert dann für jede Anforderung ein leeres500– keine Fehlerseite, nichts im IIS‑Log, nur ein Eintrag im Windows‑Ereignisprotokoll (Quelle ASP.NET). Lizenzen werden auswwwrootunter dem Site‑Root gelesen und nirgendwo sonst, und das Basis‑Doconut.Viewer.licmuss vorhanden sein, sonst werden die Plugin‑Lizenzen daneben nicht gelesen. Siehe Lizenz‑Einrichtung.
4. Webfarm: von einem Flag zum verteilten Modus
Das klassische Modell war viewer.IsWebfarm = true plus ExportToPng(path). Das neue Modell wird einmal registriert: Jeder Knoten teilt sich einen Speicher und einen Signaturschlüssel, und ein signiertes Ticket, das an den Browser gebunden ist, ersetzt „welcher Knoten auch immer antwortet“:
Doconut.DoconutHost.Initialize(
options => options.UnsafeMode = false,
services => services.AddDoconutDistributed(d =>
{
d.Store = CloudLocation.FileShare;
d.FileShareRootPath = @"\\fileserver\doconut-shared"; // WebfarmPath ist ein Alias
d.SigningKey = farmKey; // >= 32 bytes, auf jedem Knoten gleich
}));Öffnen Sie dann Dokumente wie gewohnt, binden den Browser (DocOptions.BrowserId = DoconutFarmBinding.EnsureBrowserId(...)) und übergeben viewer.AccessToken an das Widget mit dem Token. Sitzungen & Sicherheit hat die Schritte; das Webfarm-Beispiel ist ein vollständiger Knoten. IsWebfarm und WebfarmPath kompilieren weiterhin, aber sie schalten nichts mehr um.
Zwei Dinge, die wie Erfolg aussehen, es aber nicht tun: DistributedDocumentPublisher.PublishAsync schreibt die gerenderten Dateien eines Dokuments, öffnet jedoch keine Sitzung, sodass ein Betrachter, der auf ein veröffentlichtes Token zeigt, das ~2 KB‑Fehlerbild mit Status 200 erhält; und ein Testclient ohne das doconut-client‑Cookie erhält dasselbe Bild, nicht ein 401. Unterscheiden Sie eine echte Seite vom Fehlerbild anhand der Größe.
5. Konvertierung ist ein Plugin und viel kleiner
Das SourceFormatConverter‑Enum, die zwölf *ConfigConverter‑Klassen und deren verschachtelten Ziel‑Enums werden durch ein Enum, ConversionTarget, und einen Aufruf ersetzt:
using System.IO;
using System.Threading;
using Doconut;
using Doconut.Configs.Conversion;
// Angenommen DoconutHost ist bereits initialisiert und ein CancellationToken mit dem Namen ct ist verfügbar.
var provider = DoconutHost.Services;
var converter = (DocumentConverter)provider.GetService(typeof(DocumentConverter));
Stream source = /* Ihr Eingabestream */;
var result = await converter.ConvertAsync(source, ".dwg", ConversionTarget.Pdf, null, ct);Das Quellformat stammt aus der übergebenen Erweiterung. Es gibt keinen Kompatibilitäts‑Shim: Jede SourceFormatConverter‑Referenz ist ein Kompilierfehler, den Sie durch Löschen beheben. Die pro‑Format‑Option‑Objekte haben es nicht überlebt — WordConfigConverter.HtmlOptions und CadConfigConverter.CadOptions.ShowColor haben keine Entsprechung über ConvertAsync. In Web Forms sollten Sie niemals auf ConvertAsync blockieren — siehe Konverter‑Plugin.
6. Cloud‑Speicher: Zugriff als gemeinsamen Ordner
Die Cloud‑Konfigurationstypen wurden unverändert nach Doconut.Clouds verschoben. Die Cloud‑Request‑Handler hingegen sind ASP.NET‑Core‑Komponenten, und eine klassische Anwendung hat keine Pipeline, um sie auszuführen. Von einer System.Web‑Seite aus greifen Sie auf Cloud‑Speicher als gemeinsamen Ordner zu – auf Azure ein Azure‑Files‑Share, das auf jedem Knoten gemountet ist – adressiert über FileShareConfig.
7. Die clientseitigen Änderungen, die stillschweigend fehlschlagen
Jeder untenstehende Punkt kompiliert, läuft, protokolliert nichts und macht das Falsche:
| Vorher | Jetzt |
|---|---|
ResPath: 'doconut-res' | ResPath: 'doconut-res/images' — sonst erzeugt jedes Symbol 404, während das Dokument gerendert wird |
function ctlDoc_ViewerReady() { } | docViewer({ onViewerReady: function () { } }) — Viewer‑Callbacks sind jetzt Optionen |
var viewer = $(el).docViewer({...}).View(token) | Weisen Sie zuerst docViewer(...) zu, rufen Sie dann viewer.View(token) separat auf |
viewer.Refit(), um eine Seite anzupassen | viewer.FitType('width') — Refit() berechnet nur das Layout neu |
var n = viewer.Search(kw, exact) | viewer.Search(kw, exact, function (n) { … }) — die Anzahl kommt im Callback an |
if (viewer.SaveAnnotations()) { … } | docViewer({ onAnnSaved: …, onAnnSaveError: … }) |
function ctlDoc_Created() { } (Annotationen) | Unverändert — Annotations‑Ereignis‑Funktionen sind immer noch global, werden per Name gefunden |
Drei weitere: Der Viewer zeichnet seine eigene Symbolleiste nicht (Ihre Seite verbindet Zoom, Next, GotoPage und den Rest mit ihren eigenen Schaltflächen); ein Viewer, der in einem versteckten Bootstrap‑Modal erstellt wird, misst 0×0 und zeichnet nichts, bis Sie seinem Container eine explizite Höhe geben und ihn bei shown.bs.modal neu anpassen; und AllowSearch verwendet standardmäßig false für PDF, sodass ein Dokument perfekt gerendert wird, während jede Suche nichts zurückliefert.
8. Was verschwindet
| Weg | Stattdessen |
|---|---|
DocumentSearch / TextSearch.cs | Nichts — die Suche läuft auf dem Text, den die Format‑Viewer extrahieren |
Viewer.WatermarkInfo | Keine Entsprechung |
WordConfigConverter.HtmlOptions | Keine Optionsobjekte über ConvertAsync |
SourceFormatConverter, die *ConfigConverter Klassen | ConversionTarget und ConvertAsync |
Doconut.Configs.Editor | Entfernt |
viewer.IsWebfarm + ExportToPng(path) | AddDoconutDistributed und gewöhnliches Öffnen |
Vorgeschlagene Arbeitsreihenfolge
- Ziel neu ausrichten, das Paket austauschen und
Global.asaxmitDoconutHost.Initializeund den beidenWeb.configRegistrierungen kompilieren lassen. Die Seite sollte starten. - Eine Viewer‑Seite: ein Dokument zum Rendern erhalten, dann Abschnitt 7 durcharbeiten, bis die Symbolleiste, Suche und Anmerkungen funktionieren. In einem echten Browser überprüfen — in diesem Abschnitt wird kein Fehler ausgelöst.
- Konvertierung (Abschnitt 5): mechanisch und die meisten Kompilierungsfehler.
- Die restlichen Seiten, wobei die portierten Beispiele als Diff‑Ziel verwendet werden.
- Der Web‑Farm (Abschnitt 4), falls vorhanden. Mit zwei Knoten und einem Browser testen oder mit einem Client, der Cookies speichert.
War diese Seite hilfreich?