Ρύθμιση Άδειας
Πού ψάχνει το Doconut για το αρχείο άδειας σας
Χωρίς άδεια, το Doconut εξακολουθεί να αποδίδει έγγραφα — κάθε σελίδα φέρει απλώς ένα υδατογράφημα αξιολόγησης. Αυτή η σελίδα καλύπτει τους τέσσερις τρόπους παροχής άδειας και την ακριβή προτεραιότητα όταν ορίζονται περισσότερα από ένα.
Τέσσερις τρόποι παροχής άδειας
Υπάρχουν τέσσερις: τρεις ρητές πηγές στο DoconutOptions — μια ροή, ακατέργαστο περιεχόμενο ή διαδρομή αρχείου — καθώς και αυτόματη ανίχνευση όταν καμία δεν έχει οριστεί. Όταν ορίζονται περισσότερες από μία, η προτεραιότητα είναι ακριβής:
LicenseStream υπερισχύει του LicenseContent υπερισχύει του LicensePath υπερισχύει του auto-search.
Με διαδρομή
LicensePath περνιέται στο File.Exists ακριβώς όπως δίνεται. Μια σχετική διαδρομή επιλύεται σε σχέση με τον τρέχοντα φάκελο εργασίας της διεργασίας — όχι τον φάκελο του έργου σας, και όχι τον φάκελο όπου βρίσκεται το Program.cs. Αν η διαδρομή δεν επιλυθεί, το Doconut δεν πετάει εξαίρεση και δεν επιστρέφει στην αυτόματη αναζήτηση — απλώς δεν φορτώνει άδεια και το πρόγραμμα προβολής προσθέτει υδατογράφημα. Η αυτόματη αναζήτηση εκτελείται μόνο όταν κανένα από τα LicensePath, LicenseContent ή LicenseStream δεν έχει οριστεί. Τα αρχεία άδειας ανά plugin στον ίδιο φάκελο (Doconut.Viewer.<Capability>.lic) διαβάζονται μαζί του, έτσι ώστε τα LicensePath και AddPlugin<...>() να λειτουργούν μαζί όταν οι άδειες των plugins βρίσκονται δίπλα στην κύρια άδεια.
Προτιμήστε μια απόλυτη διαδρομή (για παράδειγμα δημιουργημένη από IWebHostEnvironment.WebRootPath ή AppContext.BaseDirectory), ή παραλείψτε εντελώς το LicensePath και βασιστείτε στην αυτόματη ανίχνευση παρακάτω.
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
});Με ροή
LicenseStream διαβάζεται μία φορά κατά την εκκίνηση — χρήσιμο όταν η άδεια προέρχεται από μυστικό αποθηκευτικό χώρο αντί για αρχείο στο δίσκο.
// Ιεραρχία: LicenseStream > LicenseContent > LicensePath > αυτόματη αναζήτηση.
builder.Services.AddDoconut(options =>
{
options.LicenseStream = licenseStream;
});Με περιεχόμενο
LicenseContent δέχεται το ίδιο το κείμενο της άδειας — από μεταβλητή περιβάλλοντος, βάση δεδομένων ή διαχειριστή μυστικών:
// XML άδειας από βάση δεδομένων, μεταβλητή περιβάλλοντος ή διαχειριστή μυστικών —
// Κανένα αρχείο στο δίσκο. Υπέρβηται μόνο από LicenseStream.
builder.Services.AddDoconut(options =>
{
options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});Αυτόματη ανίχνευση
Μη διαμορφώσετε καμία από τις τρεις ρητές πηγές, και το Doconut θα ψάξει την άδεια αυτόματα:
// Μην ρυθμίσετε τίποτα και το Doconut ψάχνει την άδεια μόνο του, μόνο σε αυτούς τους δύο φακέλους:
// 1. {CurrentDirectory}/wwwroot
// 2. {AppContext.BaseDirectory}/wwwroot (wwwroot μέσα στο φάκελο εξόδου της κατασκευής)
// Αναζητά πρώτα το Doconut.lic, μετά το Doconut.Viewer.lic, καθώς και τυχόν ανά plugin.
// Αρχεία Doconut.Viewer.<Capability>.lic δίπλα του.
builder.Services.AddDoconut();Οι φάκελοι ανίχνευσης, με τη σειρά, και τα ονόματα αρχείων που ψάχνονται σε καθέναν:
1. {CurrentDirectory}/wwwroot
2. {AppContext.BaseDirectory}/wwwroot
Filenames (checked in each folder above, in order):
Doconut.lic — base viewer license (checked first)
Doconut.Viewer.lic — base viewer license
Doconut.Viewer.<Capability>.lic — per-plugin license, alongside the base licenseΤίποτα εκτός ενός φακέλου wwwroot δεν διαβάζεται: ένα .lic στον ίδιο φάκελο εξόδου, ή στο wwwroot/lib, αγνοείται.
Αντιγράψτε την άδεια στο φάκελο εξόδου σας
Όταν η διεργασία δεν εκτελείται από τον φάκελο του έργου — μια δημοσιευμένη εφαρμογή, IIS, ένα κοντέινερ, ένας εκτελεστής δοκιμών — η πρώτη ανίχνευση αποτυγχάνει, και η δεύτερη, {AppContext.BaseDirectory}/wwwroot, πρέπει να βρει το αρχείο. Η δοκιμαστική εφαρμογή του SDK αντιγράφει τις άδειες εκεί σε κάθε κατασκευή με αυτόν τον στόχο MSBuild:
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
<ItemGroup>
<DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
<StaleOutputLicenses Include="$(OutDir)wwwroot\*.lic" />
</ItemGroup>
<!-- Διαγράψτε πρώτα, ώστε η μετονομασία ή η αφαίρεση ενός .lic στο wwwroot να το αφαιρεί επίσης από την έξοδο. -->
<Delete Files="@(StaleOutputLicenses)" />
<Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)wwwroot" />
</Target>Ο προορισμός πρέπει να είναι $(OutDir)wwwroot: ένα .lic που αντιγράφεται στη ρίζα εξόδου δεν εντοπίζεται ποτέ από την αυτόματη αναζήτηση. Τα παραδείγματα LicensePath σε αυτή τη σελίδα δείχνουν στην ίδια θέση.
Κρατήστε τα αρχεία
.licεκτός ελέγχου πηγής — αναπτύξτε τα δίπλα στην εφαρμογή, ή ενσωματώστε την άδεια μέσωLicenseContentήLicenseStreamαπό το μυστικό σας αποθηκευτικό χώρο.
Τι συμβαίνει χωρίς άδεια
Η απουσία άδειας δεν προκαλεί εξαίρεση. AddDoconut() επιτυγχάνει, η εφαρμογή ξεκινά και ο προβολέας λειτουργεί — αλλά κάθε σελίδα φέρει υδατογράφημα αξιολόγησης και δεν χορηγείται καμία προαιρετική δυνατότητα.
Ένα αρχείο άδειας που βρέθηκε αλλά απορρίφθηκε είναι διαφορετικό. Μια μη έγκυρη υπογραφή, παραποίηση, μαύρη λίστα ή μια έκδοση εκτός του χρονικού παραθύρου της άδειας προκαλεί το OpenDocumentAsync να ρίξει LicenseException με License.RejectionMessage. Μια άδεια που έχει λήξει κατά ημερολογιακό τρόπο και δεν έχει μήνυμα απόρριψης συνεχίζει σε λειτουργία με υδατογράφημα.
Τα πρόσθετα χρειάζονται δυνατότητες
Η καταχώρηση ενός πρόσθετου χωρίς αντίστοιχη δικαιούσια είναι διαφορετική: για έλλειψη άδειας, ένα παλιό αρχείο TRIAL, ή μια επί πληρωμή άδεια χωρίς αυτή τη δυνατότητα, το AddDoconut() ρίχνει InvalidOperationException, έτσι η εφαρμογή δεν ξεκινά. Για παράδειγμα, η καταχώρηση του πρόσθετου 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<...>() για εκείνο το πρόσθετο, είτε εγκαταστήστε μια επί πληρωμή άδεια ή μια ενεργή προσωρινή/δωρεάν (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() ρίχνει εξαίρεση για ένα πρόσθετο | Η άδεια δεν χορηγεί αυτή τη δυνατότητα του πρόσθετου | Ελέγξτε το IsCapabilityGranted(...) και αφαιρέστε τις καταχωρήσεις που δεν αγοράσατε |
| Μια ρυθμισμένη σχετική διαδρομή λειτουργεί τοπικά αλλά όχι στο IIS/container | Ο τρέχων φάκελος εργασίας της διαδικασίας άλλαξε | Χρησιμοποιήστε το AppContext.BaseDirectory ή μια απόλυτη διαδρομή |
Αντικαταστημένο .lic αρχείο δεν έχει καμία επίδραση | Η υπηρεσία άδειας singleton είχε ήδη δημιουργηθεί | Επανεκκινήστε την εφαρμογή |
OpenDocumentAsync ρίχνει LicenseException | Η υπογραφή, ο τομέας, το χρονικό παράθυρο έκδοσης, η μαύρη λίστα ή η πύλη χρόνου εκτέλεσης του πρόσθετου απέρριψαν την άδεια | Διαβάστε το μήνυμα εξαίρεσης/απόρριψης χωρίς να το εκθέσετε σε μη αξιόπιστους πελάτες |
Επόμενα βήματα
- Αδειοδότηση — δυνατότητες, επίπεδα αδειών και επαλήθευση του τι φορτώθηκε κατά την εκτέλεση.
- Αντιμετώπιση προβλημάτων — υδατογραφήματα, απορριπτέες άδειες και σφάλματα δυνατότητας.
Ήταν αυτή η σελίδα χρήσιμη;