Μετανάστευση

Doconut.NETFramework 26.8.0 (.NET Framework 4.7) σε 26.9.0 (.NET Framework 4.7.2)

Αυτή η σελίδα καλύπτει την αναβάθμιση μιας υπάρχουσας εφαρμογής ASP.NET από Doconut.NETFramework 26.8.0 ή παλαιότερη (.NET Framework 4.7) σε 26.9.0 και μεταγενέστερη (.NET Framework 4.7.2). Το πακέτο δειγμάτων Doconut περιλαμβάνει τον πλήρη οδηγό μετεγκατάστασης και τα κλασικά δείγματα προσαρμοσμένα στο νέο API — MVC 5, ένα web farm και Web Forms. Η σύγκριση της εφαρμογής σας με το δείγμα από το οποίο ξεκίνησε είναι η πιο γρήγορη διαδρομή.

Ένα πακέτο, δύο εκδόσεις

Και οι δύο βιβλιοθήκες δημοσιεύονται με το ίδιο ID πακέτου, Doconut.NETFramework. Η έκδοση τις διακρίνει:

ΈκδοσηΣτόχοςAPI
26.8.0 και παλαιότερη.NET Framework 4.7το προηγούμενο API
26.9.0 και μεταγενέστερη.NET Framework 4.7.2το νέο API

Η ενημέρωση του πακέτου είναι η αναβάθμιση. Δεν υπάρχει ξεχωριστό πακέτο για εγκατάσταση και δεν υπάρχει επίπεδο συμβατότητας: το 26.9.0 είναι διαφορετική επιφάνεια API, οπότε περιμένετε σφάλματα μεταγλώττισης μετά την ενημέρωση — το υπόλοιπο αυτής της σελίδας. Η σειρά .NET Framework 4.7 έχει διακοπεί και το 26.8.0 είναι η τελευταία έκδοσή της. Μπορείτε να παραμείνετε σε αυτήν — τίποτα εδώ δεν είναι διόρθωση ασφαλείας που θα χάνατε — αλλά οι νέες εκδόσεις, τα πρόσθετα, η διανεμημένη λειτουργία και τα ενσωματωμένα widget είναι διαθέσιμα μόνο στο 26.9.0 και μεταγενέστερα.

1. Επαναστοχοποίηση και ενημέρωση του πακέτου

Επαναστοχεύστε το web project στο .NET Framework 4.7.2 πρώτα: ένα project που εξακολουθεί να στοχεύει στο 4.7 δεν μπορεί να εγκαταστήσει το 26.9.0, και το NuGet απορρίπτει την ενημέρωση. Στη συνέχεια ενημερώστε το Doconut.NETFramework και προσθέστε τα πακέτα πρόσθετων που χρησιμοποιείτε (Doconut.NETFramework.Converter, Doconut.NETFramework.Dicom, …). Κάθε πρόσθετο χρειάζεται μια άδεια που το χορηγεί.

Αν το project χρησιμοποιεί το packages.config, η ενημέρωση εκτελεί το βήμα απεγκατάστασης της προηγούμενης έκδοσης, το οποίο αφαιρεί τον χειριστή DocImage από το Web.config, και το 26.9.0 δεν τον προσθέτει ξανά. Καταχωρίστε το ξανά όπως φαίνεται στο βήμα 3· μέχρι να το κάνετε, το DocImage.axd επιστρέφει 404 και καμία σελίδα δεν αποδίδεται.

2. Ονοματοχώροι: σχεδόν όλα μεταφέρθηκαν στη ρίζα

ΠρινΤώρα
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;αμετάβλητο

Τα ονόματα τύπων δεν άλλαξαν: WordConfig, PdfConfig, ExcelConfig, CssConfig, ScriptConfig, FileShareConfig και τα υπόλοιπα είναι ακόμα εκεί. Στα περισσότερα αρχεία η ολόκληρη επεξεργασία είναι η διαγραφή γραμμών using.

3. Εκκίνηση: DoconutHost.Initialize και δύο καταχωρήσεις Web.config

Το κλασικό πακέτο δημιουργούσε τον προβολέα του ανά αίτηση, με επιλογές ως ιδιότητες αυτής της στιγμής. Το νέο πακέτο έχει μια ρίζα σύνθεσης, που δημιουργείται μία φορά στο Application_Start, και ο προβολέας είναι μια υπηρεσία που επιλύετε:

csharp
// Πριν - Doconut.NETFramework 26.8.0 και παλαιότερες, κατόπιν αιτήματος
var viewer = new Viewer
{
    ID = "ctlDoc",
    IncludeJQuery = true,
    BasePath = "/",
    FitType = "width"
};
csharp
// Doconut.NETFramework 26.9.0\u002B - Προβολέας επιλύεται από το DoconutHost, η άδεια ρυθμίζεται μία φορά στο DoconutHost.Initialize()
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
var token  = await viewer.OpenDocumentAsync(path, new PdfConfig { AllowSearch = true });

DoconutHost.Initialize πηγαίνει στο Application_Start και το DoconutHost.Shutdown στο Application_End, και το Web.config αποκτά τον χειριστή DocImage.axd και το μονάδα πόρων — και τα δύο βρίσκονται στην Installation. Οι ρυθμίσεις εμφάνισης ανά σελίδα (FitType, FixedZoom, ShowHyperlinks, …) μεταφέρθηκαν από την παρουσία του προβολέα στις επιλογές του widget, ή σε ένα ViewerConfig που περνιέται στο Viewer.RenderViewer (δείτε το ViewerConfig). Το new Viewer() εξακολουθεί να μεταγλωττίζεται μόλις εκτελεστεί το DoconutHost.Initialize, ώστε ο μεταφερθείς κώδικας-πίσω να μπορεί να διατηρήσει αυτή τη γραμμή ενώ μετακινείτε τις ρυθμίσεις.

Η ασφάλεια λειτουργεί όπως πριν. Το άνοιγμα ενός εγγράφου χορηγεί στην τρέχουσα συνεδρία ASP.NET πρόσβαση στις σελίδες του, και DocImage.axd αρνείται σε όλους τους άλλους. Η ρύθμιση εφαρμογής DoconutUnSafeMode που απενεργοποιούσε αυτό τώρα είναι options.UnsafeMode στο DoconutHost.Initialize — αφήστε το false. Δείτε το Sessions & Security.

Η αποτυχία εκκίνησης που καταρρίπτει ολόκληρο τον ιστότοπο. Ένα καταχωρημένο πρόσθετο του οποίου η δυνατότητα δεν χορηγείται από άδεια πετάει στο Application_Start, και η εφαρμογή τότε απαντά με ένα κενό 500 σε κάθε αίτηση — χωρίς σελίδα σφάλματος, τίποτα στο αρχείο καταγραφής IIS, μόνο μια καταχώρηση στο αρχείο καταγραφής συμβάντων των Windows (πηγή ASP.NET). Οι άδειες διαβάζονται από το wwwroot κάτω από τη ρίζα του ιστότοπου και πουθενά αλλού, και η βασική Doconut.Viewer.lic πρέπει να υπάρχει ή οι άδειες του πρόσθετου δίπλα της δεν διαβάζονται. Δείτε το License Setup.

4. Φάρμα ιστού: από σημαία σε κατανεμημένη λειτουργία

Το κλασικό μοντέλο ήταν viewer.IsWebfarm = true συν ExportToPng(path). Το νέο μοντέλο καταχωρείται μία φορά: κάθε κόμβος μοιράζεται ένα αποθηκευτικό χώρο και ένα κλειδί υπογραφής, και ένα υπογεγραμμένο εισιτήριο δεσμευμένο στον περιηγητή αντικαθιστά το «οποιοσδήποτε κόμβος απαντά»:

csharp
Doconut.DoconutHost.Initialize(
    options => options.UnsafeMode = false,
    services => services.AddDoconutDistributed(d =>
    {
        d.Store             = CloudLocation.FileShare;
        d.FileShareRootPath = @"\\fileserver\doconut-shared";   // WebfarmPath είναι ένα ψευδώνυμο
        d.SigningKey        = farmKey;                           // >= 32 bytes, το ίδιο σε κάθε κόμβο
    }));

Στη συνέχεια ανοίξτε τα έγγραφα κανονικά, συνδέοντας τον περιηγητή (DocOptions.BrowserId = DoconutFarmBinding.EnsureBrowserId(...)) και παραδίδοντας viewer.AccessToken στο widget με το διακριτικό. Συνεδρίες & Ασφάλεια περιγράφει τα βήματα· το παράδειγμα web-farm είναι ένας πλήρης κόμβος. IsWebfarm και WebfarmPath εξακολουθούν να μεταγλωττίζονται, αλλά δεν ενεργοποιούν πλέον τίποτα.

Δύο πράγματα που φαίνονται επιτυχία αλλά δεν είναι: DistributedDocumentPublisher.PublishAsync γράφει τα αποδομένα αρχεία ενός εγγράφου αλλά δεν ανοίγει συνεδρία, έτσι ένας προβολέας που δείχνει σε ένα δημοσιευμένο διακριτικό λαμβάνει την εικόνα σφάλματος ~2 KB με κατάσταση 200· και ένας πελάτης δοκιμής χωρίς το cookie doconut-client λαμβάνει την ίδια εικόνα, όχι ένα 401. Διακρίνετε μια πραγματική σελίδα από την εικόνα σφάλματος βάσει του μεγέθους.

5. Η μετατροπή είναι ένα πρόσθετο, και πολύ μικρότερο

Το enum SourceFormatConverter, οι δώδεκα κλάσεις *ConfigConverter, και τα ένθετα enum στόχων τους αντικαθίστανται από ένα enum, ConversionTarget, και μία κλήση:

csharp
using System.IO;
using System.Threading;
using Doconut;
using Doconut.Configs.Conversion;

// Υποθέστε ότι το DoconutHost είναι ήδη αρχικοποιημένο και ένα CancellationToken με όνομα ct είναι διαθέσιμο.
var provider = DoconutHost.Services;
var converter = (DocumentConverter)provider.GetService(typeof(DocumentConverter));
Stream source = /* η ροή εισόδου σας */;
var result = await converter.ConvertAsync(source, ".dwg", ConversionTarget.Pdf, null, ct);

Η μορφή προέλευσης προέρχεται από την επέκταση που περνάτε. Δεν υπάρχει shim συμβατότητας: κάθε αναφορά SourceFormatConverter είναι σφάλμα μεταγλώττισης που λύντε διαγράφοντάς την. Τα αντικείμενα επιλογών ανά μορφή δεν επιβίωσαν — WordConfigConverter.HtmlOptions και CadConfigConverter.CadOptions.ShowColor δεν έχουν ισοδύναμο μέσω ConvertAsync. Στα Web Forms, ποτέ μην μπλοκάρετε στο ConvertAsync — δείτε Πρόσθετο Μετατροπέα.

6. Αποθήκευση στο σύννεφο: προσπελάστε την ως κοινόχρηστο φάκελο

Οι τύποι ρυθμίσεων του σύννεφου μεταφέρθηκαν στο Doconut.Clouds αμετάβλητοι. Οι διαχειριστές αιτημάτων σύννεφου, ωστόσο, είναι στοιχεία ASP.NET Core, και μια κλασική εφαρμογή δεν έχει κανάλι επεξεργασίας για να τα εκτελέσει. Από έναν ιστότοπο System.Web, προσπελάστε την αποθήκευση σύννεφου ως κοινόχρηστο φάκελο — στο Azure, ένα Azure Files share προσαρτημένο σε κάθε κόμβο — προσβάσιμο μέσω FileShareConfig.

7. Οι αλλαγές στην πλευρά του πελάτη που αποτυγχάνουν σιωπηρά

Κάθε στοιχείο παρακάτω μεταγλωττίζεται, εκτελείται, δεν καταγράφει τίποτα και κάνει το λάθος:

ΠρινΤώρα
ResPath: 'doconut-res'ResPath: 'doconut-res/images' — διαφορετικά κάθε εικονίδιο δίνει 404 ενώ το έγγραφο αποδίδεται
function ctlDoc_ViewerReady() { }docViewer({ onViewerReady: function () { } }) — οι κλήσεις επιστροφής του προβολέα είναι τώρα επιλογές
var viewer = $(el).docViewer({...}).View(token)Αναθέστε πρώτα το docViewer(...), έπειτα καλέστε το viewer.View(token) ξεχωριστά
viewer.Refit() για να ταιριάζει σε μια σελίδαviewer.FitType('width') — Refit() μόνο επαναϋπολογίζει τη διάταξη
var n = viewer.Search(kw, exact)viewer.Search(kw, exact, function (n) { … }) — η μέτρηση φτάνει στην κλήση επιστροφής
if (viewer.SaveAnnotations()) { … }docViewer({ onAnnSaved: …, onAnnSaveError: … })
function ctlDoc_Created() { } (σχόλια)Αμετάβλητο — οι συναρτήσεις γεγονότων σχολίων είναι ακόμα καθολικές, εντοπίζονται με το όνομα

Τρία ακόμη: ο προβολέας δεν σχεδιάζει τη δική του γραμμή εργαλείων (η σελίδα σας συνδέει τα Zoom, Next, GotoPage και τα υπόλοιπα στα δικά του κουμπιά); ένας προβολέας που δημιουργείται μέσα σε ένα κρυφό modal Bootstrap μετρά 0×0 και δεν σχεδιάζει τίποτα μέχρι να δώσετε στο κοντέινερ του ένα ρητό ύψος και να το προσαρμόσετε ξανά στο shown.bs.modal· και το AllowSearch προεπιλέγει το false για PDF, έτσι ένα έγγραφο αποδίδεται τέλεια ενώ κάθε αναζήτηση δεν επιστρέφει τίποτα.

8. Τι εξαφανίζεται

ΑπώνΑντί
DocumentSearch / TextSearch.csΤίποτα — η αναζήτηση εκτελείται στο κείμενο που εξάγουν οι προβολείς μορφής
Viewer.WatermarkInfoΔεν υπάρχει ισοδύναμο
WordConfigConverter.HtmlOptionsΔεν υπάρχουν αντικείμενα επιλογής μέσω ConvertAsync
SourceFormatConverter, οι κλάσεις *ConfigConverterConversionTarget και ConvertAsync
Doconut.Configs.EditorΑφαιρέθηκε
viewer.IsWebfarm + ExportToPng(path)AddDoconutDistributed και κανονικό άνοιγμα

Προτεινόμενη σειρά εργασίας

  1. Αναπροσανατολίστε, αλλάξτε το πακέτο και κάντε το Global.asax να μεταγλωττίζεται με DoconutHost.Initialize και τις δύο εγγραφές Web.config. Ο ιστότοπος θα πρέπει να ξεκινήσει.
  2. Μία σελίδα προβολέα: αποκτήστε ένα έγγραφο για απόδοση, έπειτα εργαστείτε μέσω της ενότητας 7 μέχρι η γραμμή εργαλείων, η αναζήτηση και οι σημειώσεις να λειτουργούν. Επαληθεύστε σε πραγματικό πρόγραμμα περιήγησης — τίποτα σε αυτήν την ενότητα δεν προκαλεί σφάλμα.
  3. Μετατροπή (ενότητα 5): μηχανική, και τα περισσότερα σφάλματα μεταγλώττισης.
  4. Οι υπόλοιπες σελίδες, χρησιμοποιώντας τα μεταφερθέντα δείγματα ως στόχο διαφορών.
  5. Η farm ιστού (ενότητα 4), αν έχετε μία. Δοκιμάστε με δύο κόμβους και ένα πρόγραμμα περιήγησης, ή έναν πελάτη που διατηρεί cookies.

Ήταν αυτή η σελίδα χρήσιμη;