Pengaktifan aplikasi di ASP.NET Core

Oleh Kirk Larkin dan Rick Anderson

ASP.NET Aplikasi inti yang dibuat dengan templat web berisi kode pengaktifan aplikasi dalam Program.cs file.

Kode startup aplikasi berikut mendukung:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthorization();

app.MapGet("/hi", () => "Hello!");

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Untuk informasi selengkapnya tentang pengaktifan aplikasi, lihat gambaran umum dasar-dasar ASP.NET Core.

Kelas Startup mengonfigurasi layanan dan alur permintaan aplikasi.

Kelas Startup

ASP.NET Core menggunakan Startup kelas , yang dinamai Startup menurut konvensi. Startup Kelas yang dimaksud:

  • Secara opsional menyertakan ConfigureServices metode untuk mengonfigurasi layanan aplikasi. Layanan adalah komponen yang dapat digunakan kembali yang menyediakan fungsionalitas aplikasi. Layanan terdaftar di ConfigureServices dan digunakan di seluruh aplikasi melalui injeksi dependensi (DI) atau ApplicationServices.
  • Configure Menyertakan metode untuk membuat alur pemrosesan permintaan aplikasi.

ConfigureServices dan Configure dipanggil oleh runtime ASP.NET Core saat aplikasi dimulai:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

Sampel sebelumnya adalah untuk Razor Pages; versi MVC serupa.

Kelas Startup ditentukan saat host aplikasi dibuat. Kelas Startup biasanya ditentukan dengan memanggil WebHostBuilderExtensions.UseStartup/<TStartup> metode pada pembangun host:

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Host menyediakan layanan yang tersedia untuk Startup konstruktor kelas. Aplikasi ini menambahkan layanan tambahan melalui ConfigureServices. Layanan host dan aplikasi tersedia di Configure dan di seluruh aplikasi.

Hanya jenis layanan berikut yang dapat disuntikkan ke Startup konstruktor saat menggunakan Host Generik (IHostBuilder):

public class Startup
{
    private readonly IWebHostEnvironment _env;

    public Startup(IConfiguration configuration, IWebHostEnvironment env)
    {
        Configuration = configuration;
        _env = env;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        if (_env.IsDevelopment())
        {
        }
        else
        {
        }
    }
}

Sebagian besar layanan tidak tersedia sampai metode dipanggil Configure .

Beberapa Startup

Saat aplikasi menentukan kelas terpisah Startup untuk lingkungan yang berbeda (misalnya, StartupDevelopment), kelas yang sesuai Startup dipilih saat runtime. Kelas yang akhiran namanya cocok dengan lingkungan saat ini diprioritaskan. Jika aplikasi dijalankan di lingkungan Pengembangan dan menyertakan Startup kelas dan StartupDevelopment kelas, StartupDevelopment kelas akan digunakan. Untuk informasi selengkapnya, lihat Menggunakan beberapa lingkungan.

Lihat Host untuk informasi selengkapnya tentang host. Untuk informasi tentang penanganan kesalahan selama startup, lihat Penanganan pengecualian startup.

Metode ConfigureServices

Metodenya ConfigureServices adalah:

  • Opsional.
  • Dipanggil oleh host sebelum Configure metode untuk mengonfigurasi layanan aplikasi.
  • Di mana opsi konfigurasi diatur menurut konvensi.

Host dapat mengonfigurasi beberapa layanan sebelum Startup metode dipanggil. Untuk informasi selengkapnya, lihat Host.

Untuk fitur yang memerlukan penyiapan substansial, ada Add{Service} metode ekstensi pada IServiceCollection. Misalnya, TambahkanDbContext, TambahkanDefaultIdentity, TambahkanEntityFrameworkStores, dan TambahkanRazorHalaman:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>(
            options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();

        services.AddRazorPages();
    }

Menambahkan layanan ke kontainer layanan membuatnya tersedia dalam aplikasi dan dalam Configure metode . Layanan diselesaikan melalui injeksi dependensi atau dari ApplicationServices.

Metode Konfigurasi

Metode Configure ini digunakan untuk menentukan bagaimana aplikasi merespons permintaan HTTP. Alur permintaan dikonfigurasi dengan menambahkan komponen middleware ke IApplicationBuilder instans. IApplicationBuilder tersedia untuk Configure metode , tetapi tidak terdaftar dalam kontainer layanan. Hosting membuat IApplicationBuilder dan meneruskannya langsung ke Configure.

Templat ASP.NET Core mengonfigurasi alur dengan dukungan untuk:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

Sampel sebelumnya adalah untuk Razor Pages; versi MVC serupa.

Setiap Use metode ekstensi menambahkan satu atau beberapa komponen middleware ke alur permintaan. Misalnya, UseStaticFiles mengonfigurasi middleware untuk menyajikan file statis.

Setiap komponen middleware dalam alur permintaan bertanggung jawab untuk memanggil komponen berikutnya dalam alur atau sirkuit pendek rantai, jika sesuai.

Layanan tambahan, seperti IWebHostEnvironment, , ILoggerFactoryatau apa pun yang didefinisikan dalam ConfigureServices, dapat ditentukan dalam Configure tanda tangan metode. Layanan ini disuntikkan jika tersedia.

Untuk informasi selengkapnya tentang cara menggunakan IApplicationBuilder dan urutan pemrosesan middleware, lihat ASP.NET Core Middleware.

Mengonfigurasi layanan tanpa Startup

Untuk mengonfigurasi layanan dan alur pemrosesan permintaan tanpa menggunakan Startup kelas , panggil ConfigureServices dan Configure metode kenyamanan pada penyusun host. Beberapa panggilan untuk ConfigureServices ditambahkan satu sama lain. Jika beberapa Configure panggilan metode ada, panggilan terakhir Configure digunakan.

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureServices(services =>
                {
                    services.AddControllersWithViews();
                })
                .Configure(app =>
                {
                    var loggerFactory = app.ApplicationServices
                        .GetRequiredService<ILoggerFactory>();
                    var logger = loggerFactory.CreateLogger<Program>();
                    var env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>();
                    var config = app.ApplicationServices.GetRequiredService<IConfiguration>();

                    logger.LogInformation("Logged in Configure");

                    if (env.IsDevelopment())
                    {
                        app.UseDeveloperExceptionPage();
                    }
                    else
                    {
                        app.UseExceptionHandler("/Home/Error");
                        app.UseHsts();
                    }

                    var configValue = config["MyConfigKey"];
                });
            });
        });
}

Perluas Startup dengan filter startup

Gunakan IStartupFilter:

  • Untuk mengonfigurasi middleware di awal atau akhir alur Konfigurasi middleware aplikasi tanpa panggilan eksplisit ke Use{Middleware}. IStartupFilter digunakan oleh ASP.NET Core untuk menambahkan default ke awal alur tanpa harus membuat penulis aplikasi secara eksplisit mendaftarkan middleware default. IStartupFilter memungkinkan komponen yang berbeda untuk memanggil Use{Middleware} atas nama penulis aplikasi.
  • Untuk membuat alur Configure metode. IStartupFilter.Configure dapat mengatur middleware untuk dijalankan sebelum atau sesudah middleware ditambahkan oleh pustaka.

IStartupFilterConfiguremengimplementasikan , yang menerima dan mengembalikan Action<IApplicationBuilder>. Menentukan IApplicationBuilder kelas untuk mengonfigurasi alur permintaan aplikasi. Untuk informasi selengkapnya, lihat Membuat alur middleware dengan IApplicationBuilder.

Masing-masing IStartupFilter dapat menambahkan satu atau beberapa middleware dalam alur permintaan. Filter dipanggil dalam urutan ditambahkan ke kontainer layanan. Filter dapat menambahkan middleware sebelum atau sesudah meneruskan kontrol ke filter berikutnya, sehingga ditambahkan ke awal atau akhir alur aplikasi.

Contoh berikut menunjukkan cara mendaftarkan middleware dengan IStartupFilter. Middleware RequestSetOptionsMiddleware menetapkan nilai opsi dari parameter string kueri:

public class RequestSetOptionsMiddleware
{
    private readonly RequestDelegate _next;

    public RequestSetOptionsMiddleware( RequestDelegate next )
    {
        _next = next;
    }

    // Test with https://localhost:5001/Privacy/?option=Hello
    public async Task Invoke(HttpContext httpContext)
    {
        var option = httpContext.Request.Query["option"];

        if (!string.IsNullOrWhiteSpace(option))
        {
            httpContext.Items["option"] = WebUtility.HtmlEncode(option);
        }

        await _next(httpContext);
    }
}

dikonfigurasi RequestSetOptionsMiddleware di RequestSetOptionsStartupFilter kelas :

public class RequestSetOptionsStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return builder =>
        {
            builder.UseMiddleware<RequestSetOptionsMiddleware>();
            next(builder);
        };
    }
}

IStartupFilter terdaftar dalam kontainer layanan di ConfigureServices.

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
           .ConfigureAppConfiguration((hostingContext, config) =>
           {
           })
         .ConfigureWebHostDefaults(webBuilder =>
         {
             webBuilder.UseStartup<Startup>();
         })
        .ConfigureServices(services =>
        {
            services.AddTransient<IStartupFilter,
                      RequestSetOptionsStartupFilter>();
        });
}

Saat parameter string kueri untuk option disediakan, middleware memproses penetapan nilai sebelum middleware ASP.NET Core merender respons.

Urutan eksekusi middleware ditetapkan oleh urutan IStartupFilter pendaftaran:

  • Beberapa IStartupFilter implementasi dapat berinteraksi dengan objek yang sama. Jika pemesanan penting, pesan pendaftaran layanan mereka IStartupFilter agar sesuai dengan urutan yang harus dijalankan middleware mereka.

  • Pustaka dapat menambahkan middleware dengan satu atau beberapa IStartupFilter implementasi yang berjalan sebelum atau sesudah middleware aplikasi lain yang terdaftar dengan IStartupFilter. Untuk memanggil IStartupFilter middleware sebelum middleware ditambahkan oleh pustaka IStartupFilter:

    • Posisikan pendaftaran layanan sebelum pustaka ditambahkan ke kontainer layanan.
    • Untuk memanggil setelahnya, posisikan pendaftaran layanan setelah pustaka ditambahkan.

Menambahkan konfigurasi saat startup dari rakitan eksternal

Implementasi IHostingStartup memungkinkan penambahan penyempurnaan ke aplikasi saat startup dari rakitan eksternal di luar kelas aplikasi Startup . Untuk informasi selengkapnya, lihat Menggunakan rakitan startup hosting di ASP.NET Core.

Sumber Daya Tambahan: