DoconutHost
Η ρίζα σύνθεσης για το System.Web
DoconutHost (namespace Doconut) είναι μια στατική κλάση που διαχειρίζεται τις υπηρεσίες του Doconut για ολόκληρη τη διαδικασία εργασίας. Οι εφαρμογές ASP.NET Core ενσωματώνουν αυτές τις υπηρεσίες στο δικό τους δοχείο του πλαισίου· το κλασικό ASP.NET δεν έχει δοχείο, έτσι το DoconutHost δημιουργεί ένα και το διατηρεί. Ο χειριστής DocImage.axd και η μονάδα πόρων λύνουν όλα όσα χρειάζονται από αυτό, και το ίδιο κάνει και ο κώδικάς σας.
| Μέλος | Σκοπός |
|---|---|
static void Initialize(Action<DoconutOptions>? configure = null, Action<IServiceCollection>? configureServices = null) | Δημιουργεί τις υπηρεσίες — μία φορά |
static IServiceProvider Services { get; } | Το κατασκευασμένο δοχείο |
static bool IsInitialized { get; } | true μία φορά που το Initialize έχει εκτελεστεί |
static void Shutdown() | Σταματά την παρασκηνιακή εργασία και απελευθερώνει το δοχείο |
Αρχικοποίηση
Καλέστε το από Application_Start στο Global.asax.cs:
// Global.asax.cs, Application_Start - μία φορά ανά διεργασία εργαζόμενου. Μια δεύτερη κλήση δεν κάνει τίποτα:
// οι επιλογές της πρώτης κλήσης κερδίζουν.
Doconut.DoconutHost.Initialize(
options =>
{
options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
},
services =>
{
// Προαιρετικό. Εκτελείται μετά τις δικές του εγγραφές του Doconut και πριν δημιουργηθεί το container,
// ώστε να μπορεί να προσθέσει υπηρεσίες ή να αντικαταστήσει μια εγγεγραμμένη από το Doconut.
services.AddMemoryCache();
});configureλαμβάνει το DoconutOptions: άδεια, διακόπτες ασφαλείας, πρόσθετα, widgets.configureServicesείναι προαιρετικό. Εκτελείται μετά την καταχώριση των δικών του υπηρεσιών από το Doconut και πριν δημιουργηθεί το δοχείο, ώστε να μπορεί να προσθέσει υπηρεσίες —AddDoconutDistributedγια ένα web farm είναι το συνηθισμένο — ή να αντικαταστήσει μια καταχώριση που έκανε το Doconut.
Η πρώτη κλήση κερδίζει. Initialize είναι idempotent: μια δεύτερη κλήση επιστρέφει αμέσως, και κανένας από τους αντιπροσώπους του δεν εκτελείται. Αυτό κρατά ένα διπλό Application_Start ακίνδυνο, αλλά σημαίνει επίσης ότι η διαμόρφωση δεν μπορεί να αλλάξει με την επανάκληση του Initialize — επανακυκλώστε την πισίνα εφαρμογών αντί αυτού.
Μια εξαίρεση που ρίχνεται εδώ — ένα plugin χωρίς άδεια, μη έγκυρες επιλογές, μια ελλιπής διαμόρφωση farm — συμβαίνει μέσα στο Application_Start. Το ASP.NET τότε απαντά σε κάθε αίτημα με ένα κενό 500, και η εξαίρεση καταγράφεται μόνο στο αρχείο καταγραφής συμβάντων των Windows (Application log, source ASP.NET).
Υπηρεσίες και IsInitialized
Το System.Web δεν διαθέτει injection κατασκευής για ελεγκτές, σελίδες ή χειριστές, έτσι επιλύστε τις υπηρεσίες του Doconut όπου τις χρησιμοποιείτε:
// Το System.Web δεν υποστηρίζει injection κατασκευής: επιλύστε τις υπηρεσίες του Doconut όπου τις χρησιμοποιείτε.
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
// Καταχωρείται μόνο όταν το plugin Converter είναι (δείτε τη σελίδα του plugin).
var converter = Doconut.DoconutHost.Services.GetRequiredService<DocumentConverter>();Services ρίχνει InvalidOperationException (DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.) όταν διαβαστεί πριν από Initialize. Κώδικας που μπορεί να εκτελεστεί νωρίτερα — μια μονάδα, ένας στατικός κατασκευαστής — μπορεί πρώτα να ελέγξει το IsInitialized.
Τι συνήθως επιλύει ο κώδικάς σας:
| Υπηρεσία | Διάρκεια ζωής | Ρόλος |
|---|---|---|
Viewer | Προσωρινή | Άνοιγμα, κλείσιμο, σημειώσεις, βοηθητικά πόρων — δείτε Viewer |
DocumentConverter | Προσωρινή | Μετατροπή — καταχωρείται μόνο με το plugin Converter |
IDoconutLicenseService | Μοναδική | Η φορτωμένη άδεια και οι δυνατότητές της — δείτε Licensing |
DoconutOptions | Μοναδική | Οι επιλογές που περνιούνται στο Initialize |
HealthCheckService | Μοναδική | Εκτελεί τον έλεγχο υγείας "doconut" (παρακάτω) |
Επιλύστε από DoconutHost.Services, ποτέ από το δικό σας δοχείο. Η καταχώριση του Doconut σε άλλο δοχείο δημιουργεί ένα δεύτερο, ξεχωριστό σύνολο υπηρεσιών που ο χειριστής και η μονάδα δεν βλέπουν ποτέ: τα έγγραφα που ανοίγονται μέσω αυτού είναι άγνωστα στο DocImage.axd.
Τερματισμός
// Global.asax.cs, Application_End - σταματά την εργασία στο παρασκήνιο και απελευθερώνει το container.
// Ασφαλές να κληθεί δύο φορές, και ασφαλές όταν το Initialize δεν εκτελέστηκε ποτέ.
Doconut.DoconutHost.Shutdown();Shutdown σταματά την παρασκηνιακή εργασία του Doconut (χρησιμοποιείται από τη διανεμημένη λειτουργία) και απελευθερώνει το δοχείο. Είναι ασφαλές να κληθεί δύο φορές, και ασφαλές όταν το Initialize δεν έχει εκτελεστεί ποτέ — για παράδειγμα όταν η πισίνα εφαρμογών ανακυκλώνεται πριν από το πρώτο αίτημα.
Έλεγχος υγείας
Το Doconut καταχωρεί έναν έλεγχο υγείας με όνομα "doconut" που αναφέρει την κατάσταση της άδειας. Το κλασικό ASP.NET δεν έχει δικό του endpoint ελέγχου υγείας, έτσι εκθέστε το από έναν ελεγκτή:
// GET /Health - Το Doconut καταχωρεί έναν έλεγχο υγείας “doconut” που αναφέρει την κατάσταση της άδειας:
// Υγιής (έγκυρη), Υποβαθμισμένη (δοκιμαστική ή χωρίς αρχείο άδειας), Μη υγιής (λήξη).
public async Task<ActionResult> Index()
{
var health = Doconut.DoconutHost.Services.GetRequiredService<HealthCheckService>();
HealthReport report = await health.CheckHealthAsync();
Response.StatusCode = report.Status == HealthStatus.Unhealthy ? 503 : 200;
return Content(report.Status.ToString(), "text/plain");
}| Κατάσταση | Νόημα |
|---|---|
Healthy | Έχει φορτωθεί μια έγκυρη άδεια |
Degraded | Δοκιμαστική, ή δεν βρέθηκε αρχείο άδειας |
Unhealthy | Η άδεια έχει λήξει |
Οι μέθοδοι επέκτασης του ASP.NET Core
Το πακέτο περιέχει επίσης UseDoconut() και UseDoconutResources(), τις επεκτάσεις του pipeline του ASP.NET Core, επειδή μοιράζεται τον κώδικά του με τα πακέτα ASP.NET Core. Σε αυτό το πακέτο και τα δύο είναι σημειωμένα ως [Obsolete] και δεν χρησιμοποιούνται: μια εφαρμογή System.Web δεν έχει pipeline αιτήσεων για να τα προσθέσει. Οι αντικαταστάτες τους είναι οι δύο καταχωρίσεις Web.config από την Installation:
| ASP.NET Core | .NET Framework 4.7.2 |
|---|---|
builder.Services.AddDoconut(...) | DoconutHost.Initialize(...) in Application_Start |
app.UseDoconut() | Doconut.DocImageHandler on DocImage.axd in Web.config |
app.UseDoconutResources() | Doconut.DoconutResourceModule in Web.config |
| Ενσωμάτωση κατασκευής | DoconutHost.Services.GetRequiredService<T>() |
| Τερματισμός κεντρικού | DoconutHost.Shutdown() in Application_End |
Ήταν αυτή η σελίδα χρήσιμη;