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.

ÜyeAmaç
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:

csharp
// 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();
    });
  • configure DoconutOptions alır: lisans, güvenlik anahtarları, eklentiler, widget'lar.
  • configureServices isteğ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çin AddDoconutDistributed genellikle 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:

csharp
// 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:

HizmetYaşam SüresiRol
ViewerGeçiciAç, kapat, açıklamalar, kaynak yardımcıları — bakınız Görüntüleyici
DocumentConverterGeçiciDönüştürme — yalnızca Converter eklentisiyle kaydedilir
IDoconutLicenseServiceTekilYüklenen lisans ve yetenekleri — bakınız Lisanslama
DoconutOptionsTekilInitialize'a geçirilen seçenekler
HealthCheckServiceTekil"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

csharp
// 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:

csharp
// 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");
}
DurumAnlam
HealthyGeçerli bir lisans yüklendi
DegradedDeneme sürümü veya lisans dosyası bulunamadı
UnhealthyLisans 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ı enjeksiyonuDoconutHost.Services.GetRequiredService<T>()
Ana bilgisayar kapatmasıDoconutHost.Shutdown() içinde Application_End

Bu sayfa yardımcı oldu mu?