Migration von der klassischen .NET 6-Integration
Verschieben einer bestehenden Doconut.NET6-Anwendung zur aktuellen DI- und Async-API
Doconut verfügt über zwei unterschiedliche .NET 6-Integrationen. Sie können denselben Paketnamen Doconut.NET6 verwenden, daher sollten Sie die Generation anhand der APIs in der Anwendung identifizieren, bevor Sie Pakete, Startup, Lizenzen oder Browser‑Ressourcen ändern.
Welche .NET 6-Integration verwenden Sie?
| Falls das Projekt enthält… | Generation |
|---|---|
app.MapWhen(... "DocImage.axd" ...) | Legacy / klassisch |
new Viewer(_cache, _accessor, ...) | Legacy / klassisch |
Viewer.DoconutLicense(...) oder Viewer.SetLicensePlugin(...) | Legacy / klassisch |
Manuell kopiertes docViewer.js, documentLinks.js oder docViewer.UI.js | Legacy / klassisch |
builder.Services.AddDoconut(...) | Aktuelle Integration |
app.UseDoconutResources() plus app.UseDoconut() | Aktuelle Integration |
Viewer über Dependency Injection bereitgestellt | Aktuelle Integration |
await viewer.OpenDocumentAsync(...) | Aktuelle Integration |
Wenn beide Spalten in derselben Anwendung erscheinen, betrachten Sie die Migration als unvollständig. Senden Sie kein Dokument‑Token über Ressourcen oder Middleware der anderen Generation.
Warum der NuGet‑Paketname Sie möglicherweise nicht informiert
Beide Generationen wurden unter der Paket‑ID Doconut.NET6 ausgeliefert. Ein Paket‑Verweis, Lock‑File oder gecachtes .nupkg identifiziert die hostende API daher nicht von selbst. Notieren Sie die genaue Paketversion und prüfen Sie gemeinsam Program.cs, Viewer‑Konstruktion, Dokument‑Öffnung und Browser‑Skripte.
Die für diesen Leitfaden geprüfte aktuelle Version ist Doconut.NET6 26.7.0. Die optionalen öffentlichen Pakete sind Doconut.NET6.Converter und Doconut.NET6.Dicom, beide auf dieselbe Release‑Version wie das Kernpaket festgelegt.
Bevor Sie migrieren
- Erstellen Sie einen Branch und ein deploybares Backup der bestehenden Anwendung.
- Notieren Sie die exakten Kern‑ und Plugin‑Paketversionen.
- Inventarisieren Sie jedes
DocImage.axd‑Mapping, jedennew Viewer(...)‑Aufruf, Lizenz‑Lade‑Aufruf, kopiertes Doconut‑Skript, benutzerdefinierte Toolbar‑Aktion und jeden Dokument‑Öffnen‑Endpunkt. - Bewahren Sie die aktuellen
.lic‑Dateien und Deployment‑Secrets außerhalb der Versionskontrolle auf. - Erfassen Sie ein repräsentatives Set von PDF, Office, Bild, CAD, E‑Mail, DICOM, durchsuchbaren, passwortgeschützten und annotierten Dokumenten.
- Notieren Sie das aktuelle Session‑Timeout, das Sicherheitsverhalten, die Schriftarten und die Plattform‑Einstellungen.
Migrieren Sie zunächst eine Umgebung, bevor Sie die Produktion umstellen. Die aktuelle Integration ändert Service‑Lebensdauer, Request‑Routing, Session‑Eigentümerschaft und die Auslieferung von Client‑Ressourcen.
Paket‑ und Lizenz‑Kompatibilität
Ersetzen oder aktualisieren Sie das Kernpaket bewusst; verlassen Sie sich nicht auf die identische Paket‑ID, um die neue API auszuwählen. Der Standardbefehl installiert das neueste stabile Release:
dotnet add package Doconut.NET6Für eine reproduzierbare Migration zur in diesem Leitfaden geprüften Version geben Sie die Version als separates Argument an:
dotnet add package Doconut.NET6 --version 26.7.0Halten Sie jedes Doconut‑Plugin auf derselben Version wie das Kernpaket. Die aktuelle Integration lädt Lizenzen einmalig während AddDoconut(), nach folgender Priorität:
LicenseStream > LicenseContent > LicensePath > automatische ErkennungDie automatische Erkennung sucht nach Doconut.Viewer.lic und zugehörigen Doconut.Viewer.<Capability>.lic‑Dateien. Ein klassischer Aufruf von Viewer.DoconutLicense(...) oder Viewer.SetLicensePlugin(...) ist kein aktueller Startup‑Mechanismus. Verschieben Sie die Lizenz in DoconutOptions, bewahren Sie zugehörige Dateien gemeinsam bei automatischer Erkennung, starten Sie nach einer Lizenz‑Änderung neu und prüfen Sie die Fähigkeiten über IDoconutLicenseService.
Gehen Sie nicht davon aus, dass das Vorhandensein einer alten Plugin‑Lizenz das Anrecht auf einen aktuellen Plugin‑Build beweist. Testen Sie Viewer, Suche, Annotation, Converter und DICOM separat mit den freigegebenen Release‑Artefakten.
Startup und Dependency Injection
Klassische Anwendungen konstruieren Viewer mit ASP.NET‑Cache‑ und Request‑Accessor‑Abhängigkeiten:
// Classic integration — contrast only; do not compile this against the current SDK.
var viewer = new Viewer(_cache, _accessor, licenseFilePath);Die aktuelle Integration registriert Doconut einmalig und erhält Viewer über Dependency Injection:
builder.Services.AddDoconut(options =>
{
options.LicensePath = "Doconut.Viewer.lic";
options.UnsafeMode = false;
});
builder.Services.AddSession();
app.UseSession();
app.UseDoconutResources();
app.UseDoconut();Viewer ist ein transienter Service. Der Dokument‑Session‑Manager und sein Cache besitzen den längerlebigen Dokumentenzustand, nicht die konkret injizierte Viewer‑Instanz.
Middleware und Resource‑Routing
Entfernen Sie den klassischen MapWhen‑Zweig, der DocImage.axd erkennt:
// Classic integration — remove during the cutover.
app.MapWhen(
context => context.Request.Path.ToString().EndsWith("DocImage.axd"),
branch => branch.UseDoconut(new DoconutOptions()));Im aktuellen Pipeline‑Verlauf:
- Rufen Sie
UseSession()vor Doconut auf, während Session‑Sicherheit aktiviert ist; - Rufen Sie
UseDoconutResources()vorUseDoconut()auf; - Halten Sie
ResourcesPath, die generierten Ressourcen‑URLs und den Client‑ResPathabgestimmt; - Wenn Sie
UseDoconut()einem Branch zuordnen, halten Sie diesen Branch und den Client‑BasePathabgestimmt.
MiddlewarePath ist eine validierte Konfiguration; sie erzeugt keinen eigenen ASP.NET‑Core‑Branch. Verwenden Sie entweder die einfache Pipeline im obigen Beispiel oder ein explizites app.Map("/doconut", branch => branch.UseDoconut())‑Arrangement, das konsequent vom Client genutzt wird.
Viewer‑Konstruktion und Lebensdauer
Entfernen Sie anwendungs‑eigene Caches von Viewer‑Objekten. Injizieren Sie Viewer in einen Endpunkt, Razor‑Page, Controller oder einen scoped‑Anwendungsservice:
app.MapPost("/api/open", async (Viewer viewer) =>
{
var token = await viewer.OpenDocumentAsync("wwwroot/files/Sample.pdf");
return Results.Ok(new { token });
});Das zurückgegebene Token identifiziert eine serverseitige Dokumentensitzung. Behandeln Sie es als Bearer‑Credential: loggen, persistieren oder analysieren Sie es nicht.
Öffnen und Schließen von Dokumenten
Ersetzen Sie das synchrone OpenDocument(...) durch OpenDocumentAsync(...):
// Current .NET 6 integration: Viewer comes from DI and document opening is asynchronous.
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { AllowSearch = true });Die aktuellen Überladungen akzeptieren einen Dateipfad oder Stream, eine optionale Format‑Konfiguration, optionale DocOptions und ein Cancellation‑Token. Schließen Sie die Serversitzung explizit, wenn der Browser sie nicht mehr benötigt:
viewer.CloseDocument(token);Verwenden Sie nach dem Cut‑over kein klassisches Token erneut. Öffnen Sie jedes Dokument erneut über die aktuelle API.
Konfigurationsklassen
Die aktuelle API trennt die Verantwortlichkeiten:
| Thema | Aktueller Typ |
|---|---|
| Middleware‑Pfade, Lizenzierung, Plugin‑Registrierung | DoconutOptions |
| Passwort, Timeout, Sicherheit, Wasserzeichen | DocOptions |
| Format‑Rendering und DPI | PdfConfig, WordConfig, ExcelConfig und weitere BaseConfig‑Typen |
| Browser‑Widget‑Defaults | ViewerConfig oder die entsprechenden JavaScript‑Optionen |
| Generiertes CSS und Skripte | CssConfig und ScriptConfig |
Übertragen Sie nicht DocOptions.ImageResolution als Rendering‑Steuerung. Sie ist veraltet; setzen Sie stattdessen BaseConfig.ImageResolution in der format‑spezifischen Konfiguration. Prüfen Sie alle Defaults, anstatt anzunehmen, dass eine klassische Konfiguration identisches Verhalten zeigt.
Viewer‑Toolbar, Suche und Annotation
Migrieren Sie die alten Skripte nicht einzeln. Die aktuellen Referenz‑Anwendungen setzen ein komplettes Seiten‑Package zusammen:
- Emitieren Sie Viewer‑CSS und lizenziertes Suche/Annotation‑CSS mit
ReferenceCss; - Rendern Sie die anwendungs‑eigene Viewer‑Toolbar;
- Rendern Sie
searchBarMount,annBarMountund den erforderlichen Viewer‑Mount; - Emitieren Sie Viewer‑ und lizenzierte Modul‑Skripte mit
ReferenceScripts; - Laden Sie das eigene
viewerToolbar.jsder Anwendung; - Initialisieren Sie ein
objViewer; - Initialisieren Sie die lizenzierten Suche‑ und Annotation‑Ribbons;
- Rufen Sie
attach(objViewer)für jedes Ribbon auf; - Öffnen Sie das Dokument und rufen Sie
objViewer.View(token)auf.
Suche und Annotation sind Module, die demselben Viewer angehängt sind, nicht unabhängige Toolbars. Die Haupt‑Toolbar gehört zur Host‑Anwendung; die Suche‑ und Annotation‑Ribbons sind eingebettete, funktions‑gesteuerte Ressourcen.
Entfernen Sie manuell kopierte klassische Dateien wie documentLinks.js und docViewer.UI.js erst, nachdem die aktuelle Seite mit Ressourcen funktioniert, die von ReferenceCss und ReferenceScripts bereitgestellt werden.
Plugin‑Registrierung
Klassische statische Plugin‑Lizenz‑Methoden registrieren keine aktuellen Plugins. Installieren und registrieren Sie jedes veröffentlichte Paket explizit:
builder.Services.AddDoconut(options =>
{
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});AddDoconut() prüft die registrierten Plugin‑Fähigkeiten beim Startup. Converter und DICOM sind veröffentlichte .NET 6‑Plugins. Normale Suche‑ und Annotation‑Funktionen sind integrierte lizenzierte Features, nicht AddPlugin<TPlugin>()‑Pakete.
Session‑ und Dokumentensicherheit
Die aktuelle Integration bindet Dokumente an undurchsichtige Tokens und gecachte Sessions. Bei UnsafeMode = false fügt UseDoconut() Dokument‑Zugriffssicherheit hinzu und der Host muss ASP.NET‑Session konfigurieren:
builder.Services.AddSession();
app.UseSession();Setzen Sie DocOptions.IsSecured = true, es sei denn, ein geprüftes Design erfordert etwas anderes. Verwenden Sie niemals UnsafeMode = true als Migrations‑Abkürzung. Testen Sie Anfragen ohne Token, mit einem fehlerhaften Token, einem abgelaufenen Token und einem Token aus einer anderen Browser‑Session.
Die Distributed‑Referenz‑Anwendung fügt Zugriffstickets und Transportdetails hinzu. Diese APIs sind für eine normale Single‑Node‑Migration nicht erforderlich.
Testen der Migration
Stellen Sie mindestens sicher, dass:
- die Anwendung mit der Produktions‑Lizenz und allen registrierten Plugins startet;
- Viewer‑CSS/Skripte und alle Seiten‑Bild‑Anfragen unter den gewählten Pfaden funktionieren;
- Dokument öffnen, navigieren, zoomen, Thumbnails, drucken und explizit schließen funktioniert;
- Suche in einem texthaltigen Dokument und der nicht‑durchsuchbare Zustand einer Bild‑Only‑Datei;
- Annotation laden, speichern, exportieren und Funktions‑Gating;
- Converter‑Zielerkennung, Ausgabe, Download und Wasserzeichen‑Zustand;
- DICOM‑Seiten, Frames und Animation; .NET 6‑technische Metadaten sind nicht verfügbar;
- passwortgeschützte Dokumente, benutzerdefinierte Schriftarten, nicht‑lateinischer Text und konfigurierte Timeouts;
- Ablehnung von Tokens über Session‑Grenzen und Verhalten bei abgelaufenen Sessions;
- mobile Darstellung, Dark‑Mode und der Produktions‑Reverse‑Proxy‑Pfad.
Rollback‑Plan
Bewahren Sie das klassische Deploy‑Artifact, passende Pakete, Lizenzdateien und kopierte Browser‑Ressourcen gemeinsam auf. Ein sicherer Rollback wechselt die gesamte Anwendungs‑Generation; er mischt keinen klassischen Server mit aktuellen Skripten oder einen aktuellen Server mit klassischen DocImage.axd‑Aufrufen.
Vor dem Cut‑over dokumentieren Sie:
- den Deployment‑Slot oder das Artifact, das für den Rollback verwendet wird;
- die Auswirkungen auf Datenbank/Cache, falls vorhanden;
- wie aktive Dokument‑Sessions invalidiert werden;
- den Health‑Check und das Smoke‑Document, das über den Rollback entscheidet;
- wer das vorherige Paket‑Set und die Konfiguration wiederherstellen kann.
Legacy‑Dokumentation
Das übersetzte klassische Handbuch bleibt verfügbar unter Legacy .NET 6‑Einrichtung. Das neue Gateway für klassische Integration erklärt dieselben Identifikations‑Signale und verweist zurück auf diesen Migrations‑Leitfaden.
Bewahren Sie die historische URL in Lesezeichen und Support‑Tickets, solange klassische Installationen noch existieren. Sie dokumentiert eine andere Generation und wird nicht zur aktuellen API weitergeleitet.
War diese Seite hilfreich?