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.

AnggotaTujuan
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:

csharp
// 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();
    });
  • configure menerima DoconutOptions: lisensi, saklar keamanan, plugin, widget.
  • configureServices bersifat opsional. Ia dijalankan setelah Doconut mendaftarkan layanan miliknya dan sebelum kontainer dibangun, sehingga dapat menambahkan layanan — AddDoconutDistributed untuk 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:

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

LayananMasa HidupPeran
ViewerTransientBuka, tutup, anotasi, pembantu sumber daya — lihat Viewer
DocumentConverterTransientKonversi — terdaftar hanya dengan plugin Converter
IDoconutLicenseServiceSingletonLisensi yang dimuat dan kemampuannya — lihat Licensing
DoconutOptionsSingletonOpsi yang diteruskan ke Initialize
HealthCheckServiceSingletonMenjalankan 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

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

csharp
// 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");
}
StatusArti
HealthyLisensi yang valid telah dimuat
DegradedPercobaan, atau tidak ada file lisensi yang ditemukan
UnhealthyLisensi 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 konstruktorDoconutHost.Services.GetRequiredService<T>()
Penutupan hostDoconutHost.Shutdown() di Application_End

Apakah halaman ini membantu?