Blazor

Ένας προβολέας εγγράφων που λειτουργεί μέσα στο Blazor

Blazor σας παρέχει ένα μοντέλο στοιχείων και έναν βρόχο απόδοσης που δεν δίνει πολύ σημασία στη JavaScript τρίτων. Doconut λειτουργεί με αυτό αντί εναντίον του: η απόδοση γίνεται στον διακομιστή στη δική σας διαδικασία, και το widget ενσωματώνεται σε ένα απλό στοιχείο που ελέγχετε μέσω του κανονικού κύκλου ζωής του interop.

75
επεκτάσεις αρχείων, χωρίς ανάλυση στην πλευρά του πελάτη
2
υποστηριζόμενα μοντέλα φιλοξενίας
0
φόρτο WASM για απόδοση

Το πρόβλημα

Γιατί οι συνήθεις προσεγγίσεις είναι προβληματικές στο Blazor

Η διαδρομή στην πλευρά του πελάτη σημαίνει αποστολή μιας μηχανής απόδοσης στον περιηγητή. Στο Blazor WebAssembly αυτό προστίθεται άμεσα στο μέγεθος λήψης, και καλύπτει μόνο PDF — τη στιγμή που κάποιος ανεβάζει ένα DOCX ή XLSX επιστρέφετε στην αρχή.

Η διαδρομή iframe‑to‑Office σημαίνει ότι τα έγγραφά σας περνούν από την υποδομή κάποιου άλλου, κάτι που απαιτεί συζήτηση με την ομάδα ασφαλείας σας που πιθανότατα δεν θέλετε να κάνετε δύο φορές.

Doconut ακολουθεί την τρίτη διαδρομή. Το αρχείο rasterizes σε εικόνες σελίδων από τον δικό σας διακομιστή, και το Blazor χρειάζεται μόνο να φιλοξενήσει ένα div. Το δέντρο των στοιχείων σας δεν ξαναδημιουργεί ποτέ έναν προβολέα που δεν του ανήκει, και η μηχανή diff δεν έχει τίποτα με το οποίο να συγκρουστεί.

Δυνατότητες

Τι λαμβάνετε σε μια εφαρμογή Blazor

Blazor Server και WebAssembly

Η απόδοση είναι στον διακομιστή σε κάθε περίπτωση. Στο Server η κλήση είναι άμεση· στο WebAssembly εκθέτετε την κλήση open ως ελάχιστο API endpoint και παραδίδετε το επιστρεφόμενο token στο widget. Και τα δύο απαιτούν λίγες γραμμές κώδικα.

Ενσωματώνεται μέσω OnAfterRenderAsync

Αρχικοποιήστε το widget μία φορά, μετά την πρώτη απόδοση, μέσω του τυπικού JS interop hook. Επειδή το Blazor δεν κατέχει ποτέ το εσωτερικό DOM του προβολέα, οι επόμενες επανα‑αποδόσεις το αφήνουν άθικτο.

Λειτουργεί με τη λειτουργία απόδοσης που επιλέξατε

Interactive Server, Interactive WebAssembly ή Auto. Ο προβολέας λειτουργεί με ένα αδιαφανές token αντί για κατάσταση στοιχείου, έτσι η αλλαγή λειτουργίας απόδοσης δεν αλλάζει την ενσωμάτωση.

Χωρίς κενά μορφών

Το ίδιο στοιχείο ανοίγει PDF, DOCX, XLSX, PPTX, DWG, MSG και το υπόλοιπο του καταλόγου. Γράφετε μία σελίδα προβολέα, όχι μία ανά οικογένεια αρχείων.

Μικρογραφίες, αναζήτηση και εκτύπωση

Το UI πλοήγησης έρχεται με το widget. Συνδέετε έναν προβολέα, όχι δημιουργώντας έναν από καμβά και είσοδο αριθμού σελίδας.

Τα έγγραφα παραμένουν στον διακομιστή σας

Τίποτα δεν μεταδίδεται στον περιηγητή εκτός από τις αποδομένες εικόνες σελίδων, κάτι που έχει μεγαλύτερη σημασία στο WebAssembly απ' ό,τι νομίζουν οι περισσότεροι — ο πελάτης είναι, τελικά, πλήρως ελέγξιμος.

Ενσωμάτωση

Program.cs και μια σελίδα Blazor

doconutHost.mount είναι μερικές γραμμές του δικού σας JavaScript που καλεί $('#div_ctlDoc').docViewer({ ... }) και στη συνέχεια .View(token). Η διατήρηση του εκτός Blazor είναι σκόπιμη — το DOM του widget δεν πρέπει να είναι κάτι που προσπαθεί να εναρμονίσει ο renderer.

Υποστηριζόμενες πλατφόρμες

Blazor ServerBlazor WebAssembly.NET 8.NET 6WindowsDocker
csharp
// Program.cs — order matters
builder.Services.AddDoconut(options =>
{
    options.LicensePath = "Doconut.Viewer.lic";
});
builder.Services.AddSession();

app.UseSession();          // before UseDoconut()
app.UseDoconutResources(); // before UseDoconut()
app.UseDoconut();

// Viewer.razor — open server-side, hand the token to the widget
@inject Doconut.Viewer Viewer
@inject IJSRuntime JS

<div id="divDocViewer"><div id="div_ctlDoc"></div></div>

@code {
    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (!firstRender) return;

        // Authorize first — the viewer renders whatever you hand it.
        string token = await Viewer.OpenDocumentAsync("wwwroot/files/Sample.pdf");
        await JS.InvokeVoidAsync("doconutHost.mount", token);
    }
}

Λεπτομέρειες

Αξίζει να γνωρίζετε πριν ξεκινήσετε

  • Το widget είναι ένα plugin jQuery, επομένως το jQuery πρέπει να φορτωθεί πριν τα scripts του προβολέα.
  • UseSession() και UseDoconutResources() πρέπει και τα δύο να εγγραφούν πριν το UseDoconut().
  • Στο WebAssembly η κλήση open ανήκει στον διακομιστή — εκθέστε την ως ελάχιστο API endpoint και επιστρέψτε μόνο το token.
  • Το token είναι αδιαφανές. Μην το τοποθετείτε σε query string που καταγράφετε, και μην το αποθηκεύετε στην κατάσταση του στοιχείου περισσότερο από όσο ζει η σελίδα.

Συχνές ερωτήσεις

Λειτουργεί αυτό στο Blazor WebAssembly, ή μόνο στο Server;

Και τα δύο. Η απόδοση γίνεται πάντα στον διακομιστή, έτσι στο WebAssembly προσθέτετε ένα endpoint που καλεί το OpenDocumentAsync και επιστρέφει το token. Ο πελάτης δεν αναλύει ποτέ ένα έγγραφο, κάτι που εξηγεί γιατί το φορτίο WASM παραμένει αμετάβλητο.

Θα συγκρουστεί ο renderer του Blazor με το DOM του προβολέα;

Όχι, εφόσον ενσωματώνετε σε ένα στοιχείο που το Blazor θεωρεί φύλλο. Αποδώστε ένα κενό div και αφήστε το widget να το γεμίσει μέσω του interop — η μηχανή diff δεν έχει παιδιά για εναρμόνιση.

Χρειάζομαι ξεχωριστή σελίδα προβολέα για κάθε τύπο αρχείου;

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

Δοκιμάστε το με τα δικά σας έγγραφα

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