DoconutHost
Akar komposisi untuk System.Web
DoconutHost (namespace Doconut) adalah kelas statis yang memiliki layanan Doconut untuk seluruh proses pekerja. Aplikasi ASP.NET Core membangun layanan tersebut ke dalam kontainer milik kerangka kerja; ASP.NET klasik tidak memiliki kontainer, sehingga DoconutHost membuat satu dan menyimpannya. Penangan DocImage.axd dan modul sumber daya menyelesaikan semua yang mereka butuhkan darinya, begitu juga kode Anda.
| Anggota | Tujuan |
|---|---|
static void Initialize(Action<DoconutOptions>? configure = null, Action<IServiceCollection>? configureServices = null) | Membangun layanan — sekali |
static IServiceProvider Services { get; } | Kontainer yang dibangun |
static bool IsInitialized { get; } | true setelah Initialize dijalankan |
static void Shutdown() | Menghentikan pekerjaan latar belakang dan membuang kontainer |
Inisialisasi
Panggil dari Application_Start di Global.asax.cs:
// Global.asax.cs, Application_Start - sekali per proses worker. Panggilan kedua tidak melakukan apa-apa:
// opsi panggilan pertama menang.
Doconut.DoconutHost.Initialize(
options =>
{
options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
},
services =>
{
// Opsional. Dijalankan setelah pendaftaran Doconut sendiri dan sebelum kontainer dibangun,
// sehingga dapat menambahkan layanan atau mengganti satu layanan yang didaftarkan Doconut.
services.AddMemoryCache();
});configuremenerima DoconutOptions: lisensi, saklar keamanan, plugin, widget.configureServicesbersifat opsional. Ia dijalankan setelah Doconut mendaftarkan layanan miliknya dan sebelum kontainer dibangun, sehingga dapat menambahkan layanan —AddDoconutDistributeduntuk sebuah web farm adalah yang biasanya — atau mengganti pendaftaran yang dibuat Doconut.
Panggilan pertama menang. Initialize bersifat idempoten: panggilan kedua mengembalikan segera, dan tidak ada delegasinya yang dijalankan. Itu membuat Application_Start yang duplikat tidak berbahaya, tetapi juga berarti konfigurasi tidak dapat diubah dengan memanggil Initialize lagi — daur ulang kolam aplikasi sebagai gantinya.
Sebuah pengecualian yang dilempar di sini — plugin tanpa lisensi, opsi tidak valid, konfigurasi farm yang tidak lengkap — terjadi di dalam Application_Start. ASP.NET kemudian menjawab setiap permintaan dengan 500 kosong, dan pengecualian tersebut hanya dicatat di log peristiwa Windows (log Aplikasi, sumber ASP.NET).
Layanan dan IsInitialized
System.Web tidak memiliki injeksi konstruktor untuk pengontrol, halaman, atau penangan, sehingga selesaikan layanan Doconut di tempat Anda menggunakannya:
// System.Web tidak memiliki injeksi konstruktor: selesaikan layanan Doconut di tempat Anda menggunakannya.
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
// Terdaftar hanya ketika plugin Converter diaktifkan (lihat halaman plugin).
var converter = Doconut.DoconutHost.Services.GetRequiredService<DocumentConverter>();Services melempar InvalidOperationException (DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.) ketika dibaca sebelum Initialize. Kode yang mungkin dijalankan lebih awal — sebuah modul, konstruktor statis — dapat memeriksa IsInitialized terlebih dahulu.
Apa yang biasanya diselesaikan oleh kode Anda:
| Layanan | Masa Hidup | Peran |
|---|---|---|
Viewer | Transient | Buka, tutup, anotasi, pembantu sumber daya — lihat Viewer |
DocumentConverter | Transient | Konversi — terdaftar hanya dengan plugin Converter |
IDoconutLicenseService | Singleton | Lisensi yang dimuat dan kemampuannya — lihat Licensing |
DoconutOptions | Singleton | Opsi yang diteruskan ke Initialize |
HealthCheckService | Singleton | Menjalankan pemeriksaan kesehatan "doconut" (di bawah) |
Selesaikan dari DoconutHost.Services, jangan pernah dari kontainer milik Anda sendiri. Mendaftarkan Doconut ke dalam kontainer lain membangun sekumpulan layanan kedua yang terpisah yang tidak pernah dilihat oleh penangan dan modul: dokumen yang dibuka melalui itu tidak dikenal oleh DocImage.axd.
Penutupan
// Global.asax.cs, Application_End - menghentikan pekerjaan latar belakang dan membuang kontainer.
// Aman dipanggil dua kali, dan aman ketika Initialize tidak pernah dijalankan.
Doconut.DoconutHost.Shutdown();Shutdown menghentikan pekerjaan latar belakang Doconut (digunakan oleh mode terdistribusi) dan membuang kontainer. Aman dipanggil dua kali, dan aman ketika Initialize tidak pernah dijalankan — misalnya ketika kolam aplikasi daur ulang sebelum permintaan pertama.
Pemeriksaan kesehatan
Doconut mendaftarkan pemeriksaan kesehatan bernama "doconut" yang melaporkan status lisensi. ASP.NET klasik tidak memiliki endpoint pemeriksaan kesehatan sendiri, jadi ekspos dari sebuah pengontrol:
// GET /Health - Doconut mendaftarkan pemeriksaan kesehatan "doconut" yang melaporkan status lisensi:
// Sehat (valid), Menurun (percobaan atau tidak ada file lisensi), Tidak Sehat (kedaluwarsa).
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");
}| Status | Arti |
|---|---|
Healthy | Lisensi yang valid telah dimuat |
Degraded | Percobaan, atau tidak ada file lisensi yang ditemukan |
Unhealthy | Lisensi telah kedaluwarsa |
Metode ekstensi ASP.NET Core
Paket ini juga berisi UseDoconut() dan UseDoconutResources(), ekstensi pipeline ASP.NET Core, karena berbagi kode dengan paket ASP.NET Core. Pada paket ini keduanya ditandai [Obsolete] dan tidak digunakan: aplikasi System.Web tidak memiliki pipeline permintaan untuk menambahkannya. Pengganti mereka adalah dua pendaftaran Web.config dari Installation:
| ASP.NET Core | .NET Framework 4.7.2 |
|---|---|
builder.Services.AddDoconut(...) | DoconutHost.Initialize(...) di Application_Start |
app.UseDoconut() | Doconut.DocImageHandler pada DocImage.axd di Web.config |
app.UseDoconutResources() | Doconut.DoconutResourceModule di Web.config |
| Injeksi konstruktor | DoconutHost.Services.GetRequiredService<T>() |
| Penutupan host | DoconutHost.Shutdown() di Application_End |
Apakah halaman ini membantu?