Ρύθμιση Άδειας
Πού το Doconut αναζητά το αρχείο άδειας σας
Χωρίς άδεια, το Doconut εξακολουθεί να αποδίδει έγγραφα — κάθε σελίδα φέρει ένα υδατογράφημα αξιολόγησης. Αυτή η σελίδα καλύπτει τους τέσσερις τρόπους παροχής άδειας και την ακριβή προτεραιότητα όταν ορίζονται περισσότερα από ένα.
Τέσσερις τρόποι παροχής άδειας
Υπάρχουν τέσσερις: τρεις ρητές πηγές στο DoconutOptions — μια ροή, ακατέργαστο περιεχόμενο ή διαδρομή αρχείου — συν αυτόματη ανίχνευση όταν καμία δεν έχει οριστεί. Όταν ορίζονται περισσότερα από ένα, η προτεραιότητα είναι ακριβής:
LicenseStream υπερισχύει του LicenseContent υπερισχύει του LicensePath υπερισχύει της αυτόματης αναζήτησης.
Με διαδρομή
LicensePath περνάει στο File.Exists ακριβώς όπως δίνεται. Μια σχετική διαδρομή επιλύεται σε σχέση με τον τρέχοντα φάκελο εργασίας της διεργασίας — όχι το φάκελο του έργου σας, και όχι το φάκελο που βρίσκεται το Program.cs. Αν η διαδρομή δεν επιλυθεί, το Doconut δεν πετάει εξαίρεση και δεν επιστρέφει στην αυτόματη αναζήτηση — απλώς δεν φορτώνει άδεια και ο προβολέας εμφανίζει υδατογράφημα. Η αυτόματη αναζήτηση εκτελείται μόνο όταν δεν έχουν οριστεί LicensePath, LicenseContent ή LicenseStream.
Προτιμήστε μια απόλυτη διαδρομή (π.χ. χτισμένη από IWebHostEnvironment.WebRootPath ή AppContext.BaseDirectory), ή παραλείψτε εντελώς το LicensePath και βασιστείτε στην αυτόματη ανίχνευση παρακάτω.
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(AppContext.BaseDirectory, "Doconut.Viewer.lic");
});Με ροή
LicenseStream διαβάζεται μία φορά κατά την εκκίνηση — χρήσιμο όταν η άδεια προέρχεται από μυστικό αποθηκευτικό χώρο αντί για αρχείο στο δίσκο.
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
builder.Services.AddDoconut(options =>
{
options.LicenseStream = licenseStream;
});Με περιεχόμενο
LicenseContent δέχεται το κείμενο της άδειας — από μεταβλητή περιβάλλοντος, βάση δεδομένων ή διαχειριστή μυστικών:
// License XML from a database, environment variable, or secret manager —
// no file on disk. Beaten only by LicenseStream.
builder.Services.AddDoconut(options =>
{
options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});Αυτόματη ανίχνευση
Μην ρυθμίσετε καμία από τις τρεις ρητές πηγές και το Doconut θα ψάξει την άδεια αυτόματα:
// Configure nothing, and Doconut searches for the license itself:
// 1. {CurrentDirectory}/wwwroot
// 2. {CurrentDirectory}/wwwroot/lib
// 3. AppContext.BaseDirectory (the build output folder)
// It looks for Doconut.Viewer.lic plus any per-plugin
// Doconut.Viewer.<Capability>.lic files alongside it.
builder.Services.AddDoconut();Οι κατάλογοι ανίχνευσης, με τη σειρά, και τα ονόματα αρχείων που αναζητούνται σε καθέναν:
1. {CurrentDirectory}/wwwroot
2. {CurrentDirectory}/wwwroot/lib
3. AppContext.BaseDirectory
Filenames (checked in each directory above, in order):
Doconut.Viewer.lic — base viewer license
Doconut.Viewer.<Capability>.lic — per-plugin license, alongside Doconut.Viewer.licΑντιγραφή της άδειας στον φάκελο εξόδου
Τόσο LicensePath, όσο και η ανίχνευση του AppContext.BaseDirectory από την αυτόματη αναζήτηση, απαιτούν το αρχείο .lic να υπάρχει δίπλα στην κατασκευασμένη εφαρμογή — όχι μόνο στο φάκελο wwwroot της πηγής σας. Η δική της δοκιμαστική εφαρμογή του SDK το αντιγράφει σε κάθε κατασκευή με αυτόν τον στόχο MSBuild:
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
<ItemGroup>
<DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
</ItemGroup>
<Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
</Target>Διατηρήστε τα αρχεία
.licεκτός ελέγχου πηγαίου κώδικα — αναπτύξτε τα δίπλα στην εφαρμογή, ή ενσωματώστε την άδεια μέσωLicenseContentήLicenseStreamαπό το μυστικό σας αποθηκευτικό χώρο.
Τι συμβαίνει χωρίς άδεια
Μια ελλιπής άδεια δεν προκαλεί εξαίρεση. Το AddDoconut() ολοκληρώνεται επιτυχώς, η εφαρμογή ξεκινά, και ο προβολέας λειτουργεί — αλλά κάθε σελίδα εμφανίζει υδατογράφημα αξιολόγησης και δεν χορηγείται καμία προαιρετική δυνατότητα.
Ένα αρχείο άδειας που βρέθηκε αλλά απορρίφθηκε είναι διαφορετικό. Μια μη έγκυρη υπογραφή, παραποίηση, μαύρη λίστα ή κατασκευή εκτός του χρονικού παραθύρου έκδοσης της άδειας προκαλεί το OpenDocumentAsync να πετάξει LicenseException με License.RejectionMessage. Μια άδεια που έχει λήξει ημερολογιακά χωρίς μήνυμα απόρριψης συνεχίζει σε λειτουργία με υδατογράφημα.
Τα plugins χρειάζονται δυνατότητες
Η καταχώρηση ενός plugin χωρίς αντίστοιχη άδεια είναι διαφορετική: για ελλιπή άδεια, αρχείο κληρονομικό TRIAL ή πληρωμένη άδεια χωρίς αυτή τη δυνατότητα, το AddDoconut() πετάει InvalidOperationException, έτσι η εφαρμογή δεν ξεκινά. Για παράδειγμα, η καταχώρηση του plugin Converter χωρίς άδεια που χορηγεί Converter:
InvalidOperationException: The Converter plugin is registered via AddPlugin but no active
license grants Converter. Remove the AddPlugin<...>() call or install a license (or
trial/demo) that includes Converter.Το μήνυμα σας λέει άμεσα τη λύση: είτε αφαιρέστε την κλήση options.AddPlugin<...>() για εκείνο το plugin, είτε εγκαταστήστε μια πληρωμένη άδεια ή μια ενεργή Temporary/Demo (NFR) άδεια που χορηγεί τη δυνατότητα. Οι προσωρινές καταχωρήσεις επιτρέπεται να παραμείνουν μετά τη λήξη τους ώστε μια ήδη ρυθμισμένη εφαρμογή να υποχωρήσει σε λειτουργία με υδατογράφημα αντί να καταρρεύσει κατά την επανεκκίνηση· μετά τη λήξη, οι δυνατότητές τους παραμένουν ανενεργές.
Επαλήθευση της φορτωμένης άδειας
Χρησιμοποιήστε το IDoconutLicenseService, την ίδια πηγή αλήθειας που χρησιμοποιεί το SDK, για να εκθέσετε ένα πιστοποιημένο διαγνωστικό endpoint ή για να ελέγξετε σημαίες χαρακτηριστικών. Μην επιστρέφετε το περιεχόμενο ή τα κλειδιά της άδειας.
app.MapGet("/api/doconut/license", (IDoconutLicenseService license) => Results.Ok(new
{
viewer = license.IsViewerLicensed || license.IsTemporary,
temporary = license.IsTemporary,
search = license.IsCapabilityGranted(LicenseCapability.Search),
annotation = license.IsCapabilityGranted(LicenseCapability.Annotation),
converter = license.HasConverter,
dicom = license.HasDicom
}));Η άδεια διαβάζεται κατά την καταχώρηση του AddDoconut(). Το ResetLicense είναι επί του παρόντος μια ιδιότητα συμβατότητας χωρίς ενεργό μονοπάτι επαναφόρτωσης, έτσι η αντικατάσταση ενός αρχείου άδειας απαιτεί επανεκκίνηση της εφαρμογής.
Πίνακας αντιμετώπισης προβλημάτων
| Σύμπτωμα | Πιθανή αιτία | Έλεγχος |
|---|---|---|
| Ο προβολέας λειτουργεί αλλά κάθε σελίδα έχει υδατογράφημα | Δεν φορτώθηκε άδεια ή η άδεια έχει λήξει κατά ημερολογιακό χρόνο | Επιλύστε το IDoconutLicenseService; επαληθεύστε τον φάκελο εξόδου και τον τρέχοντα φάκελο εργασίας της διεργασίας |
AddDoconut() προκαλεί εξαίρεση για ένα plugin | Η άδεια δεν παρέχει αυτή τη δυνατότητα plugin | Ελέγξτε το IsCapabilityGranted(...) και αφαιρέστε τις εγγραφές που δεν αγοράσατε |
| Μια ρυθμισμένη σχετική διαδρομή λειτουργεί τοπικά αλλά όχι σε IIS/container | Ο τρέχων φάκελος εργασίας της διεργασίας άλλαξε | Χρησιμοποιήστε το AppContext.BaseDirectory ή μια απόλυτη διαδρομή |
Η αντικατεστημένη αρχείο .lic δεν έχει αποτέλεσμα | Η υπηρεσία άδειας singleton είχε ήδη δημιουργηθεί | Επανεκκινήστε την εφαρμογή |
OpenDocumentAsync προκαλεί LicenseException | Η υπογραφή, ο τομέας, το χρονικό παράθυρο έκδοσης, η μαύρη λίστα ή η πύλη εκτέλεσης plugin απέρριψαν την άδεια | Διαβάστε το μήνυμα εξαίρεσης/απόρριψης χωρίς να το εκθέσετε σε μη αξιόπιστους πελάτες |
Επόμενα βήματα
- Αδειοδότηση — δυνατότητες, επίπεδα αδειών και επαλήθευση του τι φορτώθηκε κατά το χρόνο εκτέλεσης.
- Αντιμετώπιση προβλημάτων — υδατογραφήματα, απορριπτέες άδειες και σφάλματα δυνατότητας.
Ήταν αυτή η σελίδα χρήσιμη;