ASP.NET Core Web Host

Catatan

Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 10 dari artikel ini.

Peringatan

Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 10 dari artikel ini.

Aplikasi ASP.NET Core mengonfigurasi dan meluncurkan host. Host bertanggung jawab atas startup aplikasi dan pengelolaan siklus hidup. Minimal, host mengonfigurasi server dan alur pemrosesan permintaan. Host juga dapat menyiapkan pengelogan, injeksi dependensi, dan konfigurasi.

Artikel ini membahas Web Host, yang tetap tersedia hanya demi kompatibilitas ke belakang. Templat ASP.NET Core membuat WebApplicationBuilder dan WebApplication, yang direkomendasikan untuk aplikasi web. Untuk informasi selengkapnya tentang WebApplicationBuilder dan WebApplication, lihat Migrasi dari ASP.NET Core di .NET 5 ke .NET 6.

Menyiapkan host

Buat host dengan menggunakan instans IWebHostBuilder. Tugas ini biasanya dilakukan di titik masuk aplikasi, Main metode dalam file Program.cs . Aplikasi biasanya memanggil metode CreateDefaultBuilder untuk mulai menyiapkan host.

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

Kode yang memanggil CreateDefaultBuilder berada dalam metode bernama CreateWebHostBuilder, yang memisahkannya dari kode dalam Main yang memanggil Run metode pada objek penyusun. Pemisahan diperlukan jika Anda menggunakan alat Entity Framework Core. Alat mengharapkan adanya metode CreateWebHostBuilder yang bisa dipanggil pada waktu desain untuk mengonfigurasi host tanpa menjalankan aplikasi. Alternatifnya adalah membuat instans IDesignTimeDBContextfactory. Untuk informasi selengkapnya, lihat Pembuatan DbContext Saat Waktu Desain.

Metode CreateDefaultBuilder melakukan tugas-tugas berikut:

Akar konten menentukan di mana host mencari file konten, seperti file tampilan MVC. Saat aplikasi diluncurkan dari folder akar proyek, folder tersebut digunakan sebagai akar konten. Perilaku ini adalah default untuk Visual Studio dan templat baru dotnet.

Untuk informasi selengkapnya tentang konfigurasi aplikasi, lihat Konfigurasi di ASP.NET Core.

Catatan

Sebagai alternatif untuk menggunakan metode statis CreateDefaultBuilder , Anda dapat membuat host dari WebHostBuilder dengan ASP.NET Core 2.x.

Saat menyiapkan host, Anda dapat menggunakan metode Configure dan ConfigureServices. Jika kelas Startup ditentukan, kelas tersebut harus menentukan metode Configure. Untuk informasi selengkapnya, lihat Pengaktifan aplikasi di ASP.NET Core. Beberapa panggilan ke ConfigureServices menggabungkan satu sama lain. Beberapa panggilan ke Configure atau UseStartup pada WebHostBuilder instans menggantikan pengaturan sebelumnya.

Metode untuk mengesampingkan konfigurasi

Anda dapat mengubah dan meningkatkan konfigurasi yang ditentukan oleh CreateDefaultBuilder. Gunakan metode ConfigureAppConfiguration dan ConfigureLogging, serta metode lain dan metode ekstensi dari IWebHostBuilder.

Berikut adalah beberapa contoh:

  • ConfigureAppConfiguration digunakan untuk menentukan properti lain IConfiguration untuk aplikasi. Panggilan berikut ke ConfigureAppConfiguration metode menambahkan delegasi untuk menyertakan konfigurasi aplikasi dalam file appsettings.xml . ConfigureAppConfiguration dapat dipanggil beberapa kali. Konfigurasi ini tidak berlaku untuk host (misalnya, URL atau lingkungan server). Untuk informasi selengkapnya, lihat bagian Nilai konfigurasi host .

    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.AddXmlFile("appsettings.xml", optional: true, reloadOnChange: true);
        })
        ...
    
  • Panggilan berikut ConfigureLogging menambahkan delegasi untuk mengonfigurasi tingkat pengelogan minimum (SetMinimumLevel) ke LogLevel. Pengaturan ini mengambil alih pengaturan dalam file appsettings.Development.json (LogLevel.Debug) dan file appsettings.Production.json (LogLevel.Error) yang dikonfigurasi CreateDefaultBuilder oleh metode . ConfigureLogging dapat dipanggil beberapa kali.

    WebHost.CreateDefaultBuilder(args)
        .ConfigureLogging(logging => 
        {
            logging.SetMinimumLevel(LogLevel.Warning);
        })
        ...
    
  • Panggilan berikut untuk ConfigureKestrel mengambil alih Limits.MaxRequestBodySize default sebesar 30.000.000 byte yang ditetapkan saat Kestrel dikonfigurasi dengan CreateDefaultBuilder metode :

    WebHost.CreateDefaultBuilder(args)
        .ConfigureKestrel((context, options) =>
        {
            options.Limits.MaxRequestBodySize = 20000000;
        });
    

Mengatur nilai konfigurasi Web Host

WebHostBuilder Instans bergantung pada pendekatan berikut untuk mengatur nilai konfigurasi host:

  • Konfigurasi pembangun host, yang mencakup variabel lingkungan yang menggunakan format ASPNETCORE_{configurationKey}. Contohnya,ASPNETCORE_ENVIRONMENT.

  • Ekstensi, seperti UseContentRoot dan UseConfiguration. Untuk informasi selengkapnya, lihat Mengambil alih konfigurasi Web Host.

  • Metode UseSetting dan kunci terkait. Saat Anda menetapkan nilai dengan UseSetting, nilai diatur sebagai string, terlepas dari jenisnya.

Host menggunakan opsi mana pun yang terakhir kali menetapkan nilai. Untuk informasi selengkapnya, lihat Mengambil alih konfigurasi Web Host.

Nama aplikasi

Menentukan nama rakitan yang berisi titik masuk untuk aplikasi.

Kunci : applicationName
Jenis: string
Default: Nama assemblasi yang memiliki titik masuk utama aplikasi.
Atur menggunakan: UseSetting
Variabel lingkungan: ASPNETCORE_APPLICATIONNAME

Properti IWebHostEnvironment.ApplicationName secara otomatis diatur ketika metode UseStartup atau Configure dipanggil selama konstruksi host. Untuk mengatur nilai secara eksplisit, gunakan ApplicationKey bidang .

WebHost.CreateDefaultBuilder(args)
    .UseSetting(WebHostDefaults.ApplicationKey, "CustomApplicationName")

Menangkap kesalahan startup

Mengontrol penangkapan kesalahan startup.

Kunci : captureStartupErrors
Jenis: bool (true atau 1)
Default: false. Jika aplikasi berjalan dengan Kestrel di belakang IIS, defaultnya adalah true.
Atur menggunakan: CaptureStartupErrors
Variabel lingkungan: ASPNETCORE_CAPTURESTARTUPERRORS

Kesalahan selama startup mengakibatkan host berhenti beroperasi ketika pengaturan menjadi false. Ketika diatur ke true, host menangkap pengecualian selama startup dan mencoba memulai server.

WebHost.CreateDefaultBuilder(args)
    .CaptureStartupErrors(true)

Akar konten

Menentukan di mana ASP.NET Core mulai mencari file konten.

Kunci : contentRoot
Jenis: string
Default: Folder yang berisi rakitan aplikasi.
Atur menggunakan: UseContentRoot
Variabel lingkungan: ASPNETCORE_CONTENTROOT

Akar konten juga digunakan sebagai jalur dasar untuk web root. Jika jalur akar konten tidak ada, host gagal memulai.

WebHost.CreateDefaultBuilder(args)
    .UseContentRoot("c:\\<content-root>")

Untuk informasi selengkapnya, lihat:

Kesalahan terperinci

Menentukan apakah akan menangkap kesalahan terperinci.

Kunci : detailedErrors
Jenis: bool (true atau 1)
Default: false
Atur menggunakan: UseSetting
Variabel lingkungan: ASPNETCORE_DETAILEDERRORS

Saat diaktifkan (atau saat nilai Lingkungan diatur ke Development), aplikasi menangkap pengecualian terperinci.

WebHost.CreateDefaultBuilder(args)
    .UseSetting(WebHostDefaults.DetailedErrorsKey, "true")

Lingkungan

Mengatur lingkungan aplikasi.

Kunci : environment
Jenis: string
Default: Production
Atur menggunakan: UseEnvironment
Variabel lingkungan: ASPNETCORE_ENVIRONMENT

Lingkungan dapat diatur ke nilai apa pun. Nilai yang ditentukan kerangka kerja meliputi Development, Staging, dan Production. Nilai tidak peka terhadap huruf besar/kecil.

Secara default, Lingkungan dibaca dari ASPNETCORE_ENVIRONMENT variabel lingkungan. Saat Anda menggunakan Visual Studio, variabel lingkungan dapat diatur dalam file launchSettings.json . Untuk informasi selengkapnya, lihat lingkungan runtime ASP.NET Core.

WebHost.CreateDefaultBuilder(args)
    .UseEnvironment(EnvironmentName.Development)

Penyelenggaraan pertemuan startup

Menyediakan string yang dipisahkan dengan titik koma dari komponen startup hosting untuk dimuat saat startup.

Kunci : hostingStartupAssemblies
Jenis: string
Default: String kosong.
Atur menggunakan: UseSetting
Variabel lingkungan: ASPNETCORE_HOSTINGSTARTUPASSEMBLIES

Meskipun nilai konfigurasi secara default adalah string kosong, rakitan startup hosting selalu menyertakan rakitan aplikasi. Ketika rakitan startup hosting disediakan, rakitan tersebut ditambahkan ke perakitan aplikasi untuk dimuat saat aplikasi membangun layanan umum pada saat startup.

WebHost.CreateDefaultBuilder(args)
    .UseSetting(WebHostDefaults.HostingStartupAssembliesKey, "assembly1;assembly2")

Port HTTPS

Mengatur port HTTPS untuk pengalihan jika Anda mendapatkan koneksi non-HTTPS.

Kunci : https_port
Jenis: string
Default: Tidak ada default.
Atur menggunakan: UseSetting
Variabel lingkungan: ASPNETCORE_HTTPS_PORT

Pengaturan ini digunakan dalam memberlakukan HTTPS. Pengaturan ini tidak menyebabkan server mendengarkan port yang ditentukan. Artinya, dimungkinkan untuk mengalihkan permintaan secara tidak sengaja ke port yang tidak digunakan.

WebHost.CreateDefaultBuilder(args)
    .UseSetting("https_port", "8080")

Startup hosting mengecualikan rakitan

Menyediakan string rakitan startup hosting yang dibatasi titik koma untuk dikecualikan pada startup.

Kunci : hostingStartupExcludeAssemblies
Jenis: string
Default: String kosong.
Atur menggunakan: UseSetting
Variabel lingkungan: ASPNETCORE_HOSTINGSTARTUPEXCLUDEASSEMBLIES

WebHost.CreateDefaultBuilder(args)
    .UseSetting(WebHostDefaults.HostingStartupExcludeAssembliesKey, "assembly1;assembly2")

Utamakan URL yang dihosting

Menunjukkan apakah host harus mendengarkan URL yang dikonfigurasi dengan WebHostBuilder alih-alih URL yang dikonfigurasi dengan implementasi IServer.

Kunci : preferHostingUrls
Jenis: bool (true atau 1)
Default: false
Atur menggunakan: PreferHostingUrls
Variabel lingkungan: ASPNETCORE_PREFERHOSTINGURLS

WebHost.CreateDefaultBuilder(args)
    .PreferHostingUrls(true)

Mencegah pemulaian hosting

Mencegah pemuatan otomatis rakitan startup hosting, termasuk rakitan startup hosting yang dikonfigurasi oleh rakitan aplikasi. Untuk informasi selengkapnya, lihat Menggunakan rakitan startup hosting di ASP.NET Core.

Kunci : preventHostingStartup
Jenis: bool (true atau 1)
Default: false
Atur menggunakan: UseSetting
Variabel lingkungan: ASPNETCORE_PREVENTHOSTINGSTARTUP

WebHost.CreateDefaultBuilder(args)
    .UseSetting(WebHostDefaults.PreventHostingStartupKey, "true")

URL Server

Menunjukkan alamat IP atau alamat host dengan port dan protokol yang harus didengarkan server untuk permintaan.

Kunci : urls
Jenis: string
Default: http://localhost:5000
Atur menggunakan: UseUrls
Variabel lingkungan: ASPNETCORE_URLS

Atur ke sebuah daftar awalan URL yang dipisahkan dengan ; titik koma yang akan direspons oleh server. Contohnya,http://localhost:123. Gunakan wildcard tanda bintang * untuk menunjukkan bahwa server harus mendengarkan permintaan pada alamat IP atau nama host mana pun dengan port dan protokol yang ditentukan (misalnya, http://*:5000). Protokol (http:// atau https://) harus disertakan dengan setiap URL. Format yang didukung bervariasi di antara server.

WebHost.CreateDefaultBuilder(args)
    .UseUrls("http://*:5000;http://localhost:5001;https://hostname:5002")

Kestrel memiliki API konfigurasi endpoint-nya sendiri. Untuk informasi selengkapnya, lihat Mengonfigurasi titik akhir untuk Kestrel server web.

Waktu matikan habis

Menentukan jumlah waktu untuk menunggu Web Host dimatikan.

Kunci : shutdownTimeoutSeconds
Jenis: int
Standar: 5 detik
Atur menggunakan: UseShutdownTimeout
Variabel lingkungan: ASPNETCORE_SHUTDOWNTIMEOUTSECONDS

Meskipun kunci menerima int dengan UseSetting (misalnya, .UseSetting(WebHostDefaults.ShutdownTimeoutKey, "10")), metode ekstensi UseShutdownTimeout memerlukan TimeSpan parameter.

Selama periode batas waktu, Host Web:

  • Pemicu ApplicationStopping.
  • Mencoba menghentikan layanan yang dihosting, mencatat setiap kesalahan untuk layanan yang tidak dapat dihentikan.

Jika periode batas waktu berakhir sebelum semua layanan yang dihosting berhenti, layanan aktif yang tersisa berhenti saat aplikasi dimatikan. Layanan berhenti meskipun masih dalam proses. Jika layanan memerlukan lebih banyak waktu untuk berhenti, tingkatkan batas waktu.

WebHost.CreateDefaultBuilder(args)
    .UseShutdownTimeout(TimeSpan.FromSeconds(10))

Perakitan startup

Menentukan perakitan untuk mencari kelas Startup.

Kunci : startupAssembly
Jenis: string
Default: Rakitan aplikasi.
Atur menggunakan: UseStartup
Variabel lingkungan: ASPNETCORE_STARTUPASSEMBLY

Anda dapat mereferensikan rakitan berdasarkan nama (string) atau jenis (TStartup). Jika beberapa UseStartup metode dipanggil, panggilan terakhir lebih diutamakan.

WebHost.CreateDefaultBuilder(args)
    .UseStartup("StartupAssemblyName")
WebHost.CreateDefaultBuilder(args)
    .UseStartup<TStartup>()

Direktori root web

Mengatur jalur relatif ke aset statis aplikasi.

Kunci : webroot
Jenis: string
Default: wwwroot
Atur menggunakan: UseWebRoot
Variabel lingkungan: ASPNETCORE_WEBROOT

Jalur ke {content root}/wwwroot harus ada. Jika jalur tidak ada, penyedia file no-op akan digunakan.

WebHost.CreateDefaultBuilder(args)
    .UseWebRoot("public")

Untuk informasi selengkapnya, lihat:

Mengganti konfigurasi Web Host

Gunakan konfigurasi aplikasi di ASP.NET Core untuk mengonfigurasi Web Host.

Dalam contoh berikut, konfigurasi host secara opsional ditentukan dalam file hostsettings.json . Argumen baris perintah dapat mengambil alih konfigurasi apa pun yang dimuat dari file hostsettings.json . Konfigurasi bawaan (dalam konfigurasi) digunakan untuk mengonfigurasi host dengan UseConfiguration metode . IWebHostBuilder konfigurasi ditambahkan ke dalam konfigurasi aplikasi, tetapi hal sebaliknya tidak berlaku. Metode ConfigureAppConfiguration ini tidak memengaruhi IWebHostBuilder konfigurasi.

Menimpa konfigurasi yang disediakan oleh UseUrls dengan konfigurasi pada hostsettings.json, kemudian diikuti dengan konfigurasi argumen baris perintah:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args)
    {
        var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("hostsettings.json", optional: true)
            .AddCommandLine(args)
            .Build();

        return WebHost.CreateDefaultBuilder(args)
            .UseUrls("http://*:5000")
            .UseConfiguration(config)
            .Configure(app =>
            {
                app.Run(context => 
                    context.Response.WriteAsync("Hello, World!"));
            });
    }
}

Isi file hostsettings.json:

{
    urls: "http://*:5005"
}

Catatan

Metode ini UseConfiguration hanya menyalin kunci dari yang disediakan IConfiguration ke konfigurasi pembangun host. Oleh karena itu, mengatur reloadOnChange: true properti untuk file pengaturan JSON, INI, dan XML tidak berpengaruh.

Untuk menentukan host yang dijalankan pada URL tertentu, nilai yang diinginkan dapat diteruskan dari prompt perintah saat menjalankan dotnet run. Argumen baris perintah menimpa nilai urls dari file hostsettings.json, dan server mendengarkan pada port 8080.

dotnet run --urls "http://*:8080"

Mengelola Host Web

Untuk mengelola Web Host, Anda menggunakan metode berikut.

Run

Metode Run memulai aplikasi web dan memblokir utas panggilan hingga host dimatikan:

host.Run();

Start

Jalankan host dengan cara yang tidak memblokir dengan memanggil metodenya Start :

using (host)
{
    host.Start();
    Console.ReadLine();
}

Jika daftar URL diteruskan ke metode Start, metode tersebut akan mendengarkan pada URL yang ditentukan.

var urls = new List<string>()
{
    "http://*:5000",
    "http://localhost:5001"
};

var host = new WebHostBuilder()
    .UseKestrel()
    .UseStartup<Startup>()
    .Start(urls.ToArray());

using (host)
{
    Console.ReadLine();
}

Aplikasi ini dapat menginisialisasi dan memulai host baru dengan default yang sudah dikonfigurasi dari metode CreateDefaultBuilder menggunakan metode bantu statis. Metode ini memulai server tanpa output konsol dan menggunakan WaitForShutdown metode , yang menunggu jeda (Ctrl+C/SIGINT (Windows)/SIGINT (Windows), Ctrl+C (macOS), atau SIGTERM).

Start(RequestDelegate app)

Jalankan host dengan RequestDelegate:

using (var host = WebHost.Start(app => app.Response.WriteAsync("Hello, World!")))
{
    Console.WriteLine("Use Ctrl-C to shutdown the host...");
    host.WaitForShutdown();
}

Buat permintaan HTTP di dalam browser ke URL http://localhost:5000 untuk menerima respons "Halo Dunia!" Metode WaitForShutdown akan tetap dalam keadaan blok hingga menerima perintah berhenti (Ctrl-C/SIGINT atau SIGTERM) dikeluarkan. Aplikasi menampilkan pesan Console.WriteLine dan menunggu penekanan tombol untuk keluar.

Mulai(url string, aplikasi RequestDelegate)

Jalankan host dengan URL dan RequestDelegate:

using (var host = WebHost.Start("http://localhost:8080", app => app.Response.WriteAsync("Hello, World!")))
{
    Console.WriteLine("Use Ctrl-C to shutdown the host...");
    host.WaitForShutdown();
}

Menghasilkan hasil yang sama dengan Start(RequestDelegate app), kecuali aplikasi merespons pada http://localhost:8080 URL.

Start(Action<IRouteBuilder> routeBuilder)

Jalankan host dengan memulai dari instance IRouteBuilder (Microsoft.AspNetCore.Routing), yang menggunakan middleware perutean.

using (var host = WebHost.Start(router => router
    .MapGet("hello/{name}", (req, res, data) => 
        res.WriteAsync($"Hello, {data.Values["name"]}!"))
    .MapGet("buenosdias/{name}", (req, res, data) => 
        res.WriteAsync($"Buenos dias, {data.Values["name"]}!"))
    .MapGet("throw/{message?}", (req, res, data) => 
        throw new Exception((string)data.Values["message"] ?? "Uh oh!"))
    .MapGet("{greeting}/{name}", (req, res, data) => 
        res.WriteAsync($"{data.Values["greeting"]}, {data.Values["name"]}!"))
    .MapGet("", (req, res, data) => res.WriteAsync("Hello, World!"))))
{
    Console.WriteLine("Use Ctrl-C to shutdown the host...");
    host.WaitForShutdown();
}

Gunakan permintaan browser berikut dengan contoh:

Permintaan Jawaban
http://localhost:5000/hello/Martin Halo, Martin!
http://localhost:5000/buenosdias/Catrina Buenos dias, Catrina!
http://localhost:5000/throw/ooops! Melempar pengecualian dengan string "oops!"
http://localhost:5000/throw Melempar pengecualian dengan string "Uh oh!"
http://localhost:5000/Sante/Kevin Sante, Kevin!
http://localhost:5000 Halo Dunia!

Metode WaitForShutdown memblokir hingga jeda (Ctrl-C/SIGINT atau SIGTERM) dikeluarkan. Aplikasi menampilkan pesan Console.WriteLine dan menunggu penekanan tombol untuk keluar.

Start(string url, Action<IRouteBuilder> routeBuilder)

Jalankan host dengan memulai dengan URL dan instans IRouteBuilder:

using (var host = WebHost.Start("http://localhost:8080", router => router
    .MapGet("hello/{name}", (req, res, data) => 
        res.WriteAsync($"Hello, {data.Values["name"]}!"))
    .MapGet("buenosdias/{name}", (req, res, data) => 
        res.WriteAsync($"Buenos dias, {data.Values["name"]}!"))
    .MapGet("throw/{message?}", (req, res, data) => 
        throw new Exception((string)data.Values["message"] ?? "Uh oh!"))
    .MapGet("{greeting}/{name}", (req, res, data) => 
        res.WriteAsync($"{data.Values["greeting"]}, {data.Values["name"]}!"))
    .MapGet("", (req, res, data) => res.WriteAsync("Hello, World!"))))
{
    Console.WriteLine("Use Ctrl-C to shut down the host...");
    host.WaitForShutdown();
}

Menghasilkan hasil yang sama dengan Start(Action<IRouteBuilder routeBuilder> ), kecuali aplikasi merespons pada http://localhost:8080 URL.

StartWith(Action<IApplicationBuilder> app)

Jalankan host dengan memulai dengan delegasi yang mengonfigurasi IApplicationBuilder:

using (var host = WebHost.StartWith(app => 
    app.Use(next => 
    {
        return async context => 
        {
            await context.Response.WriteAsync("Hello World!");
        };
    })))
{
    Console.WriteLine("Use Ctrl-C to shut down the host...");
    host.WaitForShutdown();
}

Buat permintaan HTTP di dalam browser ke URL http://localhost:5000 untuk menerima respons "Halo Dunia!" Metode WaitForShutdown akan tetap dalam keadaan blok hingga menerima perintah berhenti (Ctrl-C/SIGINT atau SIGTERM) dikeluarkan. Aplikasi menampilkan pesan Console.WriteLine dan menunggu penekanan tombol untuk keluar.

StartWith(string url, Action<IApplicationBuilder> app)

Jalankan host dengan memulai dengan URL dan delegasi yang mengonfigurasi IApplicationBuilder:

using (var host = WebHost.StartWith("http://localhost:8080", app => 
    app.Use(next => 
    {
        return async context => 
        {
            await context.Response.WriteAsync("Hello World!");
        };
    })))
{
    Console.WriteLine("Use Ctrl-C to shut down the host...");
    host.WaitForShutdown();
}

Menghasilkan hasil yang sama dengan StartWith(Action<IApplicationBuilder> app), kecuali aplikasi merespons di URL http://localhost:8080.

Menggunakan antarmuka IWebHostEnvironment

Antarmuka IWebHostEnvironment menyediakan informasi tentang lingkungan hosting web aplikasi. Gunakan injeksi konstruktor untuk mendapatkan instance IWebHostEnvironment, lalu akses properti dan metode ekstensinya.

public class CustomFileReader
{
    private readonly IWebHostEnvironment _env;

    public CustomFileReader(IWebHostEnvironment env)
    {
        _env = env;
    }

    public string ReadFile(string filePath)
    {
        var fileProvider = _env.WebRootFileProvider;
        // Process the file here
    }
}

Pendekatan berbasis konvensi dapat digunakan untuk mengonfigurasi aplikasi saat startup berdasarkan lingkungan. Atau, masukkan instans ke konstruktor untuk digunakan dalam metode :

public class Startup
{
    public Startup(IWebHostEnvironment env)
    {
        HostingEnvironment = env;
    }

    public IWebHostEnvironment HostingEnvironment { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        if (HostingEnvironment.IsDevelopment())
        {
            // Development configuration
        }
        else
        {
            // Staging/Production configuration
        }

        var contentRootPath = HostingEnvironment.ContentRootPath;
    }
}

Catatan

Selain IsDevelopment metode ekstensi, IWebHostEnvironment menawarkan IsStagingmetode , IsProduction, dan IsEnvironment(string environmentName) . Untuk informasi selengkapnya, lihat lingkungan runtime ASP.NET Core.

Layanan ini IWebHostEnvironment juga bisa disuntikkan langsung ke Configure untuk menyiapkan metode alur pemrosesan:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        // In Development, use the Developer Exception Page
        app.UseDeveloperExceptionPage();
    }
    else
    {
        // In Staging/Production, route exceptions to /error
        app.UseExceptionHandler("/error");
    }

    var contentRootPath = env.ContentRootPath;
}

IWebHostEnvironment dapat disuntikkan ke dalam metode Invoke saat membuat middleware kustom:

public async Task Invoke(HttpContext context, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        // Configure middleware for Development
    }
    else
    {
        // Configure middleware for Staging/Production
    }

    var contentRootPath = env.ContentRootPath;
}

Menggunakan antarmuka IHostApplicationLifetime

IHostApplicationLifetime memungkinkan aktivitas pasca-startup dan shutdown. Tiga properti pada antarmuka adalah token pembatalan yang digunakan untuk mendaftarkan Action metode yang menentukan peristiwa startup dan shutdown.

Token pembatalan Trigger
ApplicationStarted Host sudah sepenuhnya dimulai.
ApplicationStopped Host sedang menyelesaikan proses penghentian sistem secara halus. Semua permintaan diharapkan untuk diproses. Matikan blok hingga kejadian ini selesai.
ApplicationStopping Host melakukan penutupan sistem secara bertahap. Permintaan mungkin masih dalam proses. Matikan blok hingga kejadian ini selesai.
public class Startup
{
    public void Configure(IApplicationBuilder app, IHostApplicationLifetime appLifetime)
    {
        appLifetime.ApplicationStarted.Register(OnStarted);
        appLifetime.ApplicationStopping.Register(OnStopping);
        appLifetime.ApplicationStopped.Register(OnStopped);

        Console.CancelKeyPress += (sender, eventArgs) =>
        {
            appLifetime.StopApplication();
            // Don't terminate the process immediately, wait for the Main thread to exit gracefully.
            eventArgs.Cancel = true;
        };
    }

    private void OnStarted()
    {
        // Perform post-startup activities here
    }

    private void OnStopping()
    {
        // Perform on-stopping activities here
    }

    private void OnStopped()
    {
        // Perform post-stopped activities here
    }
}

Metode StopApplication meminta penghentian aplikasi. Kelas berikut menggunakan StopApplication untuk mematikan aplikasi dengan anggun saat metode kelas Shutdown dipanggil:

public class MyClass
{
    private readonly IHostApplicationLifetime _appLifetime;

    public MyClass(IHostApplicationLifetime appLifetime)
    {
        _appLifetime = appLifetime;
    }

    public void Shutdown()
    {
        _appLifetime.StopApplication();
    }
}

Mengonfigurasi validasi cakupan

Metode CreateDefaultBuilder mengatur properti ValidateScopes menjadi true jika lingkungan aplikasi adalah Development.

Ketika ValidateScopes diatur ke true, penyedia layanan default melakukan pemeriksaan untuk memverifikasi:

  • Layanan terlingkup tidak diselesaikan secara langsung atau tidak langsung dari penyedia layanan akar.
  • Layanan terlingkup tidak secara langsung maupun tidak langsung disuntikkan ke dalam singleton.

Penyedia layanan akar dibuat ketika metode dipanggil BuildServiceProvider . Masa pakai penyedia layanan akar sesuai dengan masa pakai aplikasi/server saat penyedia mulai dengan aplikasi dan dibuang saat aplikasi dimatikan.

Kontainer yang membuat layanan tercakup juga membuang layanan. Jika layanan berlingkup dibuat dalam kontainer akar, masa pakai layanan secara efektif dipromosikan menjadi singleton. Kontainer akar membuang layanan hanya ketika aplikasi/server dimatikan. Memvalidasi cakupan layanan menangkap situasi ini ketika BuildServiceProvider dipanggil.

Untuk selalu memvalidasi cakupan, termasuk di Production lingkungan, konfigurasikan ServiceProviderOptions objek dengan UseDefaultServiceProvider metode pada pembuat host:

WebHost.CreateDefaultBuilder(args)
    .UseDefaultServiceProvider((context, options) => {
        options.ValidateScopes = true;
    })