Ρύθμιση Άδειας

Πού το Doconut ψάχνει το αρχείο άδειας σας

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

Τέσσερις τρόποι παροχής άδειας

Υπάρχουν τέσσερις: τρεις ρητές πηγές στο DoconutOptions — μια ροή, ακατέργαστο περιεχόμενο ή μια διαδρομή αρχείου — συν αυτόματη ανίχνευση όταν καμία δεν έχει οριστεί. Όταν ορίζονται περισσότερες από μία, η προτεραιότητα είναι ακριβής:

LicenseStream προηγείται του LicenseContent προηγείται του LicensePath προηγείται του auto-search.

Με διαδρομή

LicensePath περνιέται στο File.Exists ακριβώς όπως δίνεται. Μια σχετική διαδρομή επιλύεται σε σχέση με το τρέχον φάκελο εργασίας της διεργασίας — όχι το φάκελο του έργου σας, και όχι το φάκελο όπου βρίσκεται το Program.cs. Αν η διαδρομή δεν επιλυθεί, το Doconut δεν πετάει εξαίρεση και δεν επιστρέφει στην αυτόματη αναζήτηση — απλώς δεν φορτώνει άδεια και το πρόγραμμα προβολής προσθέτει υδατογράφημα. Η αυτόματη αναζήτηση εκτελείται μόνο όταν κανένα από τα LicensePath, LicenseContent ή LicenseStream δεν είναι ορισμένο. Τα αρχεία άδειας ανά plugin στον ίδιο φάκελο (Doconut.Viewer.<Capability>.lic) διαβάζονται μαζί του, έτσι τα LicensePath και AddPlugin<...>() λειτουργούν μαζί όταν οι άδειες των plugin βρίσκονται δίπλα στην κύρια άδεια.

Προτιμήστε μια απόλυτη διαδρομή (για παράδειγμα κατασκευασμένη από IWebHostEnvironment.WebRootPath ή AppContext.BaseDirectory), ή παραλείψτε εντελώς το LicensePath και βασιστείτε στην αυτόματη ανίχνευση παρακάτω.

csharp
builder.Services.AddDoconut(options =>
{
    options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
});

Με ροή

LicenseStream διαβάζεται μία φορά κατά την εκκίνηση — χρήσιμο όταν η άδεια προέρχεται από μυστικό αποθετήριο αντί για αρχείο στο δίσκο.

csharp
// Προτεραιότητα: LicenseStream > LicenseContent > LicensePath > αυτόματη αναζήτηση.
builder.Services.AddDoconut(options =>
{
    options.LicenseStream = licenseStream;
});

Με περιεχόμενο

LicenseContent δέχεται το ίδιο το κείμενο της άδειας — από μεταβλητή περιβάλλοντος, βάση δεδομένων ή διαχειριστή μυστικών:

csharp
// License XML από βάση δεδομένων, μεταβλητή περιβάλλοντος ή διαχειριστή μυστικών —
// χωρίς αρχείο στο δίσκο. Υπερβαίνεται μόνο από LicenseStream.
builder.Services.AddDoconut(options =>
{
    options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});

Αυτόματη ανίχνευση

Μη ρυθμίσετε καμία από τις τρεις ρητές πηγές, και το Doconut ψάχνει την άδεια αυτόματα:

csharp
// Μην ρυθμίσετε τίποτα και το Doconut ψάχνει για την άδεια μόνο του, μόνο σε αυτούς τους δύο φακέλους:
//   1. {CurrentDirectory}/wwwroot
//   2. {AppContext.BaseDirectory}/wwwroot   (wwwroot μέσα στο φάκελο εξόδου της κατασκευής)
// Αναζητά πρώτα το Doconut.lic, μετά το Doconut.Viewer.lic, συν οποιοδήποτε ανά plugin
// Αρχεία Doconut.Viewer.<Capability>.lic δίπλα του.
builder.Services.AddDoconut();

Οι φάκελοι ανίχνευσης, με τη σειρά, και τα ονόματα αρχείων που αναζητούνται σε καθένα:

text
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:

xml
<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:

text
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. Μην επιστρέφετε το περιεχόμενο ή τα κλειδιά της άδειας.

csharp
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Η υπογραφή, ο τομέας, το χρονικό παράθυρο έκδοσης, η μαύρη λίστα ή η πύλη χρόνου εκτέλεσης του πρόσθετου απέρριψαν την άδειαΔιαβάστε το μήνυμα εξαίρεσης/απόρριψης χωρίς να το εκθέσετε σε μη αξιόπιστους πελάτες

Επόμενα βήματα

Ήταν αυτή η σελίδα χρήσιμη;