DoconutHost
System.Web için bileşim kökü
DoconutHost (namespace Doconut) tüm işçi süreci için Doconut'un hizmetlerini sahiplenen statik bir sınıftır. ASP.NET Core uygulamaları bu hizmetleri çerçevenin kendi kapsayıcısına ekler; klasik ASP.NET'in kapsayıcısı yoktur, bu yüzden DoconutHost bir tane oluşturur ve tutar. DocImage.axd işleyicisi ve kaynak modülü ihtiyaç duydukları her şeyi ondan çözer ve kodunuz da aynı şekilde.
| Üye | Amaç |
|---|---|
static void Initialize(Action<DoconutOptions>? configure = null, Action<IServiceCollection>? configureServices = null) | Hizmetleri oluşturur — bir kez |
static IServiceProvider Services { get; } | Oluşturulan kapsayıcı |
static bool IsInitialized { get; } | true bir kez Initialize çalıştıktan sonra |
static void Shutdown() | Arka plan çalışmasını durdurur ve kapsayıcıyı serbest bırakır |
Başlatma
Bunu Application_Start içinde Global.asax.cs'den çağırın:
// Global.asax.cs, Application_Start - işçi süreci başına bir kez. İkinci çağrı bir no-op'tur:
// ilk çağrının seçenekleri kazanır.
Doconut.DoconutHost.Initialize(
options =>
{
options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
},
services =>
{
// İsteğe bağlı. Doconut'un kendi kayıtlarından sonra ve konteyner oluşturulmadan önce çalışır,
// böylece hizmet ekleyebilir veya Doconut'un kaydettiği birini değiştirebilir.
services.AddMemoryCache();
});configureDoconutOptions alır: lisans, güvenlik anahtarları, eklentiler, widget'lar.configureServicesisteğe bağlıdır. Doconut kendi hizmetlerini kaydettikten ve kapsayıcı oluşturulmadan önce çalışır, böylece hizmet ekleyebilir — web çiftliği içinAddDoconutDistributedgenellikle kullanılanıdır — ya da Doconut'un yaptığı bir kaydı değiştirebilir.
İlk çağrı kazanır. Initialize idempotenttir: ikinci bir çağrı hemen döner ve delege'lerinden hiçbiri çalışmaz. Bu, çoğaltılmış bir Application_Start'in zararsız kalmasını sağlar, ancak yapılandırmanın Initialize'ı tekrar çağırarak değiştirilemeyeceği anlamına gelir — bunun yerine uygulama havuzunu yeniden başlatın.
Burada atılan bir istisna — lisansı olmayan bir eklenti, geçersiz seçenekler, eksik bir çiftlik yapılandırması — Application_Start içinde gerçekleşir. ASP.NET daha sonra her isteğe boş bir 500 ile yanıt verir ve istisna yalnızca Windows olay günlüğünde (Uygulama günlüğü, kaynak ASP.NET) kaydedilir.
Hizmetler ve IsInitialized
System.Web, denetleyiciler, sayfalar veya işleyiciler için yapılandırıcı enjeksiyonu sağlamaz, bu yüzden Doconut'un hizmetlerini kullandığınız yerde çözümleyin:
// System.Web, yapıcı enjeksiyonunu desteklemez: Doconut hizmetlerini kullandığınız yerde çözün.
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
// Yalnızca Converter eklentisi (eklenti sayfasına bakın) olduğunda kaydedilir.
var converter = Doconut.DoconutHost.Services.GetRequiredService<DocumentConverter>();Services, Initialize'dan önce okunduğunda InvalidOperationException (DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.) fırlatır. Daha önce çalışabilecek kod — bir modül, statik bir yapılandırıcı — önce IsInitialized'ı kontrol edebilir.
Kodunuzun tipik olarak çözdüğü şeyler:
| Hizmet | Yaşam Süresi | Rol |
|---|---|---|
Viewer | Geçici | Aç, kapat, açıklamalar, kaynak yardımcıları — bakınız Görüntüleyici |
DocumentConverter | Geçici | Dönüştürme — yalnızca Converter eklentisiyle kaydedilir |
IDoconutLicenseService | Tekil | Yüklenen lisans ve yetenekleri — bakınız Lisanslama |
DoconutOptions | Tekil | Initialize'a geçirilen seçenekler |
HealthCheckService | Tekil | "doconut" sağlık kontrolünü çalıştırır (aşağıda) |
DoconutHost.Services'den çözümleyin, kendi kapsayıcınızdan asla. Doconut'u başka bir kapsayıcıya kaydetmek, işleyici ve modülün hiç görmediği ikinci, ayrı bir hizmet kümesi oluşturur: onun üzerinden açılan belgeler DocImage.axd için bilinmez.
Kapatma
// Global.asax.cs, Application_End - arka plan çalışmasını durdurur ve konteyneri temizler.
// İki kez çağırmak güvenlidir ve Initialize hiç çalışmadığında da güvenlidir.
Doconut.DoconutHost.Shutdown();Shutdown, Doconut'un arka plan çalışmasını (dağıtık modda kullanılan) durdurur ve kapsayıcıyı serbest bırakır. İki kez çağırmak güvenlidir ve Initialize hiç çalışmadığında da güvenlidir — örneğin uygulama havuzu ilk istekten önce yeniden başlatıldığında.
Sağlık Kontrolü
Doconut, lisans durumunu raporlayan "doconut" adlı bir sağlık kontrolü kaydeder. Klasik ASP.NET'in kendi sağlık kontrolü uç noktası yoktur, bu yüzden bir denetleyiciden ortaya çıkarın:
// GET /Health - Doconut, lisans durumunu raporlayan "doconut" sağlık kontrolünü kaydeder:
// Sağlıklı (geçerli), Azalan (deneme veya lisans dosyası yok), Sağlıksız (süresi dolmuş).
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");
}| Durum | Anlam |
|---|---|
Healthy | Geçerli bir lisans yüklendi |
Degraded | Deneme sürümü veya lisans dosyası bulunamadı |
Unhealthy | Lisans süresi doldu |
ASP.NET Core uzantı metodları
Paket ayrıca UseDoconut() ve UseDoconutResources() içerir, ASP.NET Core işlem hattı uzantıları, çünkü kodunu ASP.NET Core paketleriyle paylaşır. Bu pakette ikisi de [Obsolete] olarak işaretlenmiştir ve kullanılmaz: bir System.Web uygulamasının ekleyebileceği bir istek işlem hattı yoktur. Yerine geçenler, Kurulum bölümünden iki Web.config kaydıdır:
| ASP.NET Core | .NET Framework 4.7.2 |
|---|---|
builder.Services.AddDoconut(...) | DoconutHost.Initialize(...) içinde Application_Start |
app.UseDoconut() | Doconut.DocImageHandler üzerinde DocImage.axd içinde Web.config |
app.UseDoconutResources() | Doconut.DoconutResourceModule içinde Web.config |
| Yapılandırıcı enjeksiyonu | DoconutHost.Services.GetRequiredService<T>() |
| Ana bilgisayar kapatması | DoconutHost.Shutdown() içinde Application_End |
Bu sayfa yardımcı oldu mu?