Δημιουργήστε έναν Ασφαλή Προβολέα Διαχείρισης Εγγράφων σε .NET με Doconut
← Back to Blog••5 min read

Δημιουργήστε έναν Ασφαλή Προβολέα Διαχείρισης Εγγράφων σε .NET με Doconut

Υλοποίηση Διαχείρισης Εγγράφων με Doconut

Μια ροή εργασίας διαχείρισης εγγράφων σε μια .NET πύλη συνήθως χρειάζεται τρία πράγματα:

  1. Ένας τρόπος να φορτώνετε PDF, αρχεία Office, σχέδια CAD ή εικόνες χωρίς να γράψετε έναν προβολέα από την αρχή.
  2. Ένα ασφαλές διακριτικό που συνδέει το φορτωμένο έγγραφο με την τρέχουσα συνεδρία του προγράμματος περιήγησης.
  3. Ένα βήμα καθαρισμού που ελευθερώνει τη μνήμη μόλις ο χρήστης τελειώσει.

Το Doconut παρέχει όλα τα τρία μέσω μιας μοναδικής υπηρεσίας Viewer, μιας ελαφριάς συνεδρίας IMemoryCache και ρητών κλήσεων CloseDocument.


1. Καταχωρίστε τον προβολέα στο DI container

Κατά την εκκίνηση της εφαρμογής, προσθέστε τις υπηρεσίες Doconut στο DI container καλώντας τη μέθοδο καταχώρισης Doconut που περιγράφεται στην επίσημη τεκμηρίωση. Αυτό το βήμα καταχωρεί τον προβολέα, τη διαχείριση αδειών και την κρυφή μνήμη εντός μνήμης που θα κρατά τις συνεδρίες εγγράφων.

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


2. Εισάγετε το middleware που εξυπηρετεί εικόνες σελίδων, μικρογραφίες και δεδομένα σχολίων

Διαμορφώστε το Doconut middleware στη γραμμή αιτήσεων ώστε οποιοδήποτε αίτημα που περιέχει μια παράμετρο ερωτήματος ?token= να επεξεργάζεται από το Doconut. Το middleware επιβάλλει το προεπιλεγμένο σήμα ασφαλείας (secure-{token}) όταν το UnsafeMode είναι ψευδές (η προεπιλογή) και εξυπηρετεί εικόνες σελίδων, μικρογραφίες και δεδομένα σχολίων.

Η τοποθέτηση του middleware σε ξεχωριστό κλάδο διατηρεί το υπόλοιπο pipeline αμετάβλητο και επιτρέπει οριζόντια κλιμάκωση χωρίς sticky sessions.


3. Ανοίξτε ένα έγγραφο και λάβετε το αδιαφανές διακριτικό συνεδρίας

Δημιουργήστε ένα μοναδικό endpoint που λαμβάνει μια διαδρομή αρχείου (ή ροή) και επιστρέφει το διακριτικό. Το διακριτικό είναι το μοναδικό διαπιστευτήριο που βλέπει ποτέ το widget του πελάτη.

app.MapPost("/api/open", async (Viewer viewer) =>
{
    // Το διακριτικό είναι αδιαφανές — δώστε το στο widget, ποτέ μην το καταγράψετε ή το αποθηκεύσετε.
    string token = await viewer.OpenDocumentAsync("wwwroot/files/Contract.pdf");
    return Results.Ok(new { token });
});

Τι συμβαίνει μέσα στο OpenDocumentAsync

  1. Πύλη άδειας – μια μη έγκυρη άδεια ρίχνει το LicenseException αμέσως.
  2. Δημιουργία συνεδρίας – Το Doconut επιλέγει τον κατάλληλο προβολέα μορφής (PDF, Word, DWG, …) και αποθηκεύει τη μηχανή στο IMemoryCache κάτω από ένα GUID διακριτικό.
  3. Καταχώριση ασφαλείας – με το UnsafeMode = false το διακριτικό δεσμεύεται στη συνεδρία ASP.NET του καλούντος μέσω ενός σήματος secure-{token}. Μόνο αυτή η συνεδρία του προγράμματος περιήγησης μπορεί να ζητήσει σελίδες.
  4. Επιστροφή διακριτικού – ο πελάτης λαμβάνει το διακριτικό και το χρησιμοποιεί για κάθε επόμενο αίτημα (/DocImage.axd?token=…).

Η προεπιλεγμένη κυλιόμενη λήξη είναι 60 λεπτά (ρυθμιζόμενη μέσω DocOptions.TimeOut). Κάθε αίτημα σελίδας επαναφέρει το χρονόμετρο, έτσι οι αδρανείς συνεδρίες εξαφανίζονται αυτόματα.


4. Αποδώστε το έγγραφο στην πλευρά του πελάτη

Από το πρόγραμμα περιήγησης καλείτε το endpoint, παίρνετε το διακριτικό και το δίνετε στο widget Doconut:

fetch('/api/open', { method: 'POST' })
    .then(r => r.json())
    .then(d => {
        const token = d.token;
        objViewer.View(token);   // JavaScript widget που παρέχεται από Doconut
    });

Το widget εσωτερικά εκτελεί αιτήματα σελίδας, μικρογραφίας, αναζήτησης και σχολίων που όλα περιλαμβάνουν το ίδιο token. Επειδή το διακριτικό είναι δεσμευμένο στη συνεδρία του διακομιστή, ένας κακόβουλος χρήστης δεν μπορεί να υποκλέψει το έγγραφο άλλου χρήστη.


5. Κλείστε το έγγραφο μόλις ο χρήστης αφήσει τον προβολέα

Για μεγάλα PDF ή αρχεία CAD πρέπει να απελευθερώσετε τη μηχανή απόδοσης αμέσως. Καλέστε το CloseDocument από ένα endpoint στο διακομιστή ή από το γεγονός “unload” του widget.

// Τερματικό σημείο διακομιστή‑πλευράς
app.MapPost("/api/close", (Viewer viewer, string token) =>
{
    viewer.CloseDocument(token);
    return Results.Ok();
});
// Άμεση κλήση από το widget (αν εκθέσετε το διακριτικό στο backend)
viewer.CloseDocument(token);

CloseDocument αφαιρεί τη συνεδρία από την κρυφή μνήμη, απελευθερώνει τη βασική μηχανή εγγράφου, διαγράφει το σήμα secure-{token} και ανακαλεί την άδεια πρόσβασης. Η κυλιόμενη λήξη θα έκανε τελικά το ίδιο, αλλά ένα ρητό κλείσιμο εγγυάται ότι η μνήμη ανακτάται αμέσως μόλις ο χρήστης τελειώσει.


6. Προαιρετικό: Μετατροπή εγγράφου στον διακομιστή

Εάν η ροή εργασίας σας απαιτεί εξαγωγή PDF ενός ανεβασμένου αρχείου Word, ενεργοποιήστε το πρόσθετο Converter στη διαμόρφωση Doconut (δείτε την τεκμηρίωση). Αφού το πρόσθετο καταχωρηθεί, μπορείτε να ενσωματώσετε το DocumentConverter και να καλέσετε τη μέθοδο ConvertAsync. Η μετατροπή εκτελείται στον διακομιστή, έτσι δεν χρειάζεται ποτέ να έχετε εγκατεστημένο το Office στον web server.


7. Σκέψεις κλιμάκωσης για διαχείριση εγγράφων επιπέδου επιχείρησης

  • Ασυμπτωματικά front‑ends – Το widget του προβολέα δεν κρατά ποτέ δεδομένα εγγράφου· όλη η βαριά επεξεργασία παραμένει στον διακομιστή.
  • Κατανεμημένη κρυφή μνήμη – Αντικαταστήστε την προεπιλεγμένη κρυφή μνήμη εντός μνήμης με έναν κατανεμημένο πάροχο (Redis, NCache) εάν εκτελείτε πολλαπλούς κόμβους web‑farm. Η αντιστοίχηση διακριτικού‑σε‑συνεδρία λειτουργεί αμετάβλητη επειδή το middleware διαβάζει από το ρυθμισμένο IMemoryCache.
  • Εργασίες παρασκηνίου – Μπορείτε να προ‑ανοίξετε έγγραφα σε έναν background worker, να αποθηκεύσετε το διακριτικό στην κρυφή μνήμη και να το παραδώσετε στο UI αργότερα. Θυμηθείτε ότι κάθε διακριτικό είναι μονής χρήσης ανά συνεδρία· η επαναχρησιμοποίηση απαιτεί μια νέα κλήση OpenDocumentAsync.

Αυτά τα πρότυπα σας επιτρέπουν να δημιουργήσετε μια πλατφόρμα διαχείρισης εγγράφων που κλιμακώνεται από μια ενιαία εσωτερική πύλη σε ένα πολυ‑περιοχικό cloud service χωρίς να ξαναγράψετε τη λογική του προβολέα.


8. Γρήγορη λίστα ελέγχου για υλοποίηση έτοιμης παραγωγής

ΒήμαΔράση
1Καταχωρίστε τις υπηρεσίες Doconut στο Program.cs (επαλήθευση άδειας).
2Προσθέστε το middleware Doconut σε ξεχωριστό κλάδο.
3Δημιουργήστε ένα endpoint /api/open που καλεί το OpenDocumentAsync.
4Περάστε το επιστρεφόμενο διακριτικό στο objViewer.View(token) στον πελάτη.
5Καλέστε το CloseDocument(token) όταν ο προβολέας κρύβεται ή η σελίδα αποφορτώνεται.
6(Προαιρετικό) Ενεργοποιήστε το ConverterPlugin εάν χρειάζεστε μετατροπή στο διακομιστή.
7(Προαιρετικό) Αντικαταστήστε το IMemoryCache με μια κατανεμημένη κρυφή μνήμη για οριζόντια κλιμάκωση.

Ακολουθήστε τη λίστα και θα έχετε μια πλήρη, ασφαλή, υψηλής απόδοσης ροή διαχείρισης εγγράφων χτισμένη στον εγγενή .NET προβολέα του Doconut.

#document management#.NET#document viewer#Doconut#secure rendering#διαχείριση εγγράφων#προβολή εγγράφων#ασφαλής απόδοση