Ρύθμιση Άδειας
Πού το 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. Μια άδεια που έληξε ημερολογιακά και δεν έχει μήνυμα απόρριψης συνεχίζει σε λειτουργία με υδατογράφημα.
Τα πρόσθετα χρειάζονται δυνατότητες
Η καταχώριση ενός πρόσθετου χωρίς αντίστοιχη άδεια είναι διαφορετική: για έλλειψη άδειας, ένα παλιό αρχείο 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 ή για να ελέγξετε τα feature flags. Μην επιστρέφετε το περιεχόμενο ή τα κλειδιά της άδειας.
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 δεν έχει αποτέλεσμα | Η μονή υπηρεσία άδειας είχε ήδη δημιουργηθεί | Επανεκκινήστε την εφαρμογή |
OpenDocumentAsync πετάει LicenseException | Η υπογραφή, το domain, το χρονικό παράθυρο έκδοσης, η μαύρη λίστα ή η πύλη χρόνου εκτέλεσης του πρόσθετου απέρριψαν την άδεια | Διαβάστε το μήνυμα εξαίρεσης/απόρριψης χωρίς να το εκθέσετε σε μη αξιόπιστους πελάτες |
Επόμενα βήματα
- Άδεια — δυνατότητες, επίπεδα αδειών, και επαλήθευση του τι φορτώθηκε κατά την εκτέλεση.
- Αντιμετώπιση προβλημάτων — υδατογραφήματα, απορριπτέες άδειες, και σφάλματα δυνατοτήτων.
Ήταν αυτή η σελίδα χρήσιμη;