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

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

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

Η άδεια φορτώνεται μία φορά, κατά τη διάρκεια του AddDoconut(). Αυτό είναι μια αλλαγή από την προηγούμενη βιβλιοθήκη .NET Standard, όπου η άδεια παραχωρούνταν σε μια Viewer παρουσία ή ορίζονταν μέσω των στατικών κλήσεων Viewer.DoconutLicense(...) / Viewer.SetLicensePlugin(...). Αυτές οι μέθοδοι δεν αποτελούν μηχανισμό εκκίνησης σε αυτήν την έκδοση — δείτε τον οδηγό μετάβασης.

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

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

LicenseStream νικά LicenseContent νικά LicensePath νικά την αυτόματη αναζήτηση.

Με διαδρομή

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

Προτιμήστε μια απόλυτη διαδρομή (για παράδειγμα κατασκευασμένη από 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, καθώς και τυχόν ανά δυνατότητα
// αρχεία 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-capability license, alongside the base license

Τίποτα εκτός ενός φακέλου wwwroot δεν διαβάζεται: ένα .lic στον ίδιο φάκελο εξόδου, ή στο wwwroot/lib, αγνοείται.

Αν προηγουμένως περάσατε ένα List<string> διαδρομών άδειας στον κατασκευαστή Viewer — ένα ανά δυνατότητα — κρατήστε αυτά τα συνοδευτικά αρχεία δίπλα στο Doconut.Viewer.lic και αφήστε την αυτόματη ανίχνευση να τα εντοπίσει. Δεν υπάρχει επιλογή λίστας διαδρομών στο DoconutOptions.

Αντιγράψτε την άδεια στο φάκελο εξόδου σας

Όταν η διαδικασία δεν εκτελείται από το φάκελο του έργου — μια δημοσιευμένη εφαρμογή, 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/κοντέινερΟ τρέχων φάκελος εργασίας της διαδικασίας άλλαξεΧρησιμοποιήστε το AppContext.BaseDirectory ή μια απόλυτη διαδρομή
Το αντικατεστημένο αρχείο .lic δεν έχει αποτέλεσμαΗ υπηρεσία άδειας singleton είχε ήδη δημιουργηθείΕπανεκκινήστε την εφαρμογή
OpenDocumentAsync ρίχνει LicenseExceptionΥπογραφή, τομέας, χρονικό παράθυρο έκδοσης, μαύρη λίστα ή πύλη χρόνου εκτέλεσης του πρόσθετου απέρριψαν την άδειαΔιαβάστε το μήνυμα εξαίρεσης/απόρριψης χωρίς να το εκθέσετε σε μη αξιόπιστους πελάτες
Μια άδεια ανά δυνατότητα λειτουργούσε πριν αλλά όχι τώραΟ παλιός κώδικας διέδωσε ρητές διαδρομές άδειας στον κατασκευαστή ViewerΜετακινήστε τα συνοδευτικά αρχεία .lic δίπλα στο Doconut.Viewer.lic και αφήστε την αυτόματη ανακάλυψη να τα φορτώσει

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

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