Bagikan melalui


Hosting dalam proses dengan IIS dan ASP.NET Core

Hosting dalam proses menjalankan aplikasi ASP.NET Core dalam proses yang sama dengan proses pekerja IIS-nya. Hosting dalam proses memberikan peningkatan performa jika dibandingkan dengan hosting di luar proses karena permintaan tidak diproksikan melalui adapter loopback, antarmuka jaringan yang mengembalikan lalu lintas jaringan keluar kembali ke mesin yang sama.

Diagram berikut mengilustrasikan hubungan antara IIS, ASP.NET Core Module, dan aplikasi yang dihosting dalam proses:

ASP.NET Core Module in the in-process hosting scenario

Mengaktifkan hosting dalam proses

Sejak ASP.NET Core 3.0, hosting dalam proses telah diaktifkan secara default untuk semua aplikasi yang disebarkan ke IIS.

Untuk mengonfigurasi aplikasi secara eksplisit untuk hosting dalam proses, atur nilai <AspNetCoreHostingModel> properti ke InProcess dalam file proyek (.csproj):

<PropertyGroup>
  <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>

Arsitektur umum

Alur umum permintaan adalah sebagai berikut:

  1. Permintaan datang dari web ke driver HTTP.sys mode kernel.
  2. Driver merutekan permintaan native ke IIS pada port situs web yang dikonfigurasi, biasanya 80 (HTTP) atau 443 (HTTPS).
  3. ASP.NET Core Module menerima permintaan native dan meneruskannya ke Server HTTP IIS (IISHttpServer). Server HTTP IIS adalah implementasi server dalam proses untuk IIS yang mengubah permintaan dari native menjadi terkelola.

Setelah Server HTTP IIS memproses permintaan:

  1. Permintaan dikirim ke alur middleware ASP.NET Core.
  2. Alur middleware menangani permintaan dan meneruskannya sebagai instans HttpContext ke logika aplikasi.
  3. Respons aplikasi diteruskan kembali ke IIS melalui Server HTTP IIS.
  4. IIS mengirimkan respons ke klien yang menginisiasi permintaan.

CreateDefaultBuilder menambahkan instans IServer dengan memanggil metode UseIIS untuk mem-boot CoreCLR dan menghosting aplikasi di dalam proses pekerja IIS (w3wp.exe atau iisexpress.exe). Pengujian performa menunjukkan bahwa menghosting aplikasi .NET Core dalam proses memberikan throughput permintaan yang jauh lebih tinggi dibandingkan dengan menghosting aplikasi di luar proses dan melakukan proksi permintaan ke Kestrel.

Aplikasi yang diterbitkan sebagai satu file yang dapat dieksekusi tidak dapat dimuat oleh model hosting dalam proses.

Konfigurasi aplikasi

Untuk mengonfigurasi opsi IIS, sertakan konfigurasi layanan untuk IISServerOptions di Program.cs. Contoh berikut menonaktifkan AutomaticAuthentication:

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Server.IIS;
using Microsoft.EntityFrameworkCore;
using RPauth.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();

builder.Services.Configure<IISServerOptions>(options =>
{
    options.AutomaticAuthentication = false;
});

builder.Services.AddTransient<IClaimsTransformation, MyClaimsTransformation>();
builder.Services.AddAuthentication(IISServerDefaults.AuthenticationScheme);

builder.Services.AddRazorPages();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();

app.Run();
Opsi Default Pengaturan
AutomaticAuthentication true Jika true, Server IIS mengatur HttpContext.User yang diautentikasi oleh Autentikasi Windows. Jika false, server hanya memberikan identitas untuk HttpContext.User dan merespons tantangan saat diminta secara eksplisit oleh AuthenticationScheme. Autentikasi Windows harus diaktifkan di IIS agar AutomaticAuthentication berfungsi. Untuk informasi lebih lanjut, lihat Autentikasi Windows.
AuthenticationDisplayName null Mengatur nama tampilan yang ditampilkan kepada pengguna di halaman masuk.
AllowSynchronousIO false Apakah I/O sinkron diizinkan untuk HttpContext.Request dan HttpContext.Response.
MaxRequestBodySize 30000000 Mendapatkan atau mengatur ukuran isi permintaan maksimum untuk HttpRequest. Perhatikan bahwa IIS sendiri memiliki batas maxAllowedContentLength yang akan diproses sebelum MaxRequestBodySize diatur di IISServerOptions. Mengubah MaxRequestBodySize tidak akan memengaruhi maxAllowedContentLength. Untuk meningkatkan maxAllowedContentLength, tambahkan entri di web.config untuk mengatur maxAllowedContentLength ke nilai yang lebih tinggi. Untuk detail selengkapnya, lihat Konfigurasi.

Perbedaan antara hosting dalam proses dan di luar proses

Karakteristik berikut berlaku saat menghosting dalam proses:

  • Server HTTP IIS (IISHttpServer) digunakan alih-alih Kestrel server. Untuk dalam proses, CreateDefaultBuilder panggilan UseIIS ke:

    • Daftarkan IISHttpServer.
    • Konfigurasikan port dan jalur dasar yang harus didengarkan server saat berjalan di belakang Modul Inti ASP.NET.
    • Konfigurasikan host untuk menangkap kesalahan startup.
  • Atribut requestTimeout tidak berlaku untuk hosting dalam proses.

  • Berbagi kumpulan aplikasi di antara aplikasi tidak didukung. Gunakan satu kumpulan aplikasi per aplikasi.

  • Arsitektur (bitness) aplikasi dan runtime yang diinstal (x64 atau x86) harus cocok dengan arsitektur kumpulan aplikasi. Misalnya, aplikasi yang diterbitkan untuk 32-bit (x86) harus mengaktifkan 32-bit untuk Kumpulan Aplikasi IIS mereka. Untuk informasi lebih lanjut, lihat bagian Membuat situs IIS.

  • Pemutusan sambungan klien terdeteksi. Token HttpContext.RequestAborted pembatalan dibatalkan ketika klien terputus.

  • Saat menghosting dalam proses, AuthenticateAsync tidak dipanggil secara internal untuk menginisialisasi pengguna. Oleh karena itu, implementasi yang IClaimsTransformation digunakan untuk mengubah klaim setelah setiap autentikasi tidak diaktifkan secara default. Saat mengubah klaim dengan IClaimsTransformation implementasi, panggil AddAuthentication untuk menambahkan layanan autentikasi:

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Server.IIS;
using Microsoft.EntityFrameworkCore;
using RPauth.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();

builder.Services.Configure<IISServerOptions>(options =>
{
    options.AutomaticAuthentication = false;
});

builder.Services.AddTransient<IClaimsTransformation, MyClaimsTransformation>();
builder.Services.AddAuthentication(IISServerDefaults.AuthenticationScheme);

builder.Services.AddRazorPages();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();

app.Run();
  • Penyebaran Paket Web (file tunggal) tidak didukung.

Hosting dalam proses menjalankan aplikasi ASP.NET Core dalam proses yang sama dengan proses pekerja IIS-nya. Hosting dalam proses memberikan peningkatan performa jika dibandingkan dengan hosting di luar proses karena permintaan tidak diproksikan melalui adapter loopback, antarmuka jaringan yang mengembalikan lalu lintas jaringan keluar kembali ke mesin yang sama.

Diagram berikut mengilustrasikan hubungan antara IIS, ASP.NET Core Module, dan aplikasi yang dihosting dalam proses:

ASP.NET Core Module in the in-process hosting scenario

Mengaktifkan hosting dalam proses

Sejak ASP.NET Core 3.0, hosting dalam proses telah diaktifkan secara default untuk semua aplikasi yang disebarkan ke IIS.

Untuk mengonfigurasi aplikasi secara eksplisit untuk hosting dalam proses, atur nilai <AspNetCoreHostingModel> properti ke InProcess dalam file proyek (.csproj):

<PropertyGroup>
  <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>

Arsitektur umum

Alur umum permintaan adalah sebagai berikut:

  1. Permintaan datang dari web ke driver HTTP.sys mode kernel.
  2. Driver merutekan permintaan native ke IIS pada port situs web yang dikonfigurasi, biasanya 80 (HTTP) atau 443 (HTTPS).
  3. ASP.NET Core Module menerima permintaan native dan meneruskannya ke Server HTTP IIS (IISHttpServer). Server HTTP IIS adalah implementasi server dalam proses untuk IIS yang mengubah permintaan dari native menjadi terkelola.

Setelah Server HTTP IIS memproses permintaan:

  1. Permintaan dikirim ke alur middleware ASP.NET Core.
  2. Alur middleware menangani permintaan dan meneruskannya sebagai instans HttpContext ke logika aplikasi.
  3. Respons aplikasi diteruskan kembali ke IIS melalui Server HTTP IIS.
  4. IIS mengirimkan respons ke klien yang menginisiasi permintaan.

CreateDefaultBuilder menambahkan instans IServer dengan memanggil metode UseIIS untuk mem-boot CoreCLR dan menghosting aplikasi di dalam proses pekerja IIS (w3wp.exe atau iisexpress.exe). Pengujian performa menunjukkan bahwa menghosting aplikasi .NET Core dalam proses memberikan throughput permintaan yang jauh lebih tinggi dibandingkan dengan menghosting aplikasi di luar proses dan melakukan proksi permintaan ke Kestrel.

Aplikasi yang diterbitkan sebagai satu file yang dapat dieksekusi tidak dapat dimuat oleh model hosting dalam proses.

Konfigurasi aplikasi

Untuk mengonfigurasi opsi IIS, sertakan konfigurasi layanan untuk IISServerOptions di ConfigureServices. Contoh berikut menonaktifkan AutomaticAuthentication:

services.Configure<IISServerOptions>(options => 
{
    options.AutomaticAuthentication = false;
});
Opsi Default Pengaturan
AutomaticAuthentication true Jika true, Server IIS mengatur HttpContext.User yang diautentikasi oleh Autentikasi Windows. Jika false, server hanya memberikan identitas untuk HttpContext.User dan merespons tantangan saat diminta secara eksplisit oleh AuthenticationScheme. Autentikasi Windows harus diaktifkan di IIS agar AutomaticAuthentication berfungsi. Untuk informasi lebih lanjut, lihat Autentikasi Windows.
AuthenticationDisplayName null Mengatur nama tampilan yang ditampilkan kepada pengguna di halaman masuk.
AllowSynchronousIO false Apakah I/O sinkron diizinkan untuk HttpContext.Request dan HttpContext.Response.
MaxRequestBodySize 30000000 Mendapatkan atau mengatur ukuran isi permintaan maksimum untuk HttpRequest. Perhatikan bahwa IIS sendiri memiliki batas maxAllowedContentLength yang akan diproses sebelum MaxRequestBodySize diatur di IISServerOptions. Mengubah MaxRequestBodySize tidak akan memengaruhi maxAllowedContentLength. Untuk meningkatkan maxAllowedContentLength, tambahkan entri di web.config untuk mengatur maxAllowedContentLength ke nilai yang lebih tinggi. Untuk detail selengkapnya, lihat Konfigurasi.

Perbedaan antara hosting dalam proses dan di luar proses

Karakteristik berikut berlaku saat menghosting dalam proses:

  • Server HTTP IIS (IISHttpServer) digunakan alih-alih Kestrel server. Untuk dalam proses, CreateDefaultBuilder panggilan UseIIS ke:

    • Daftarkan IISHttpServer.
    • Konfigurasikan port dan jalur dasar yang harus didengarkan server saat berjalan di belakang Modul Inti ASP.NET.
    • Konfigurasikan host untuk menangkap kesalahan startup.
  • Atribut requestTimeout tidak berlaku untuk hosting dalam proses.

  • Berbagi kumpulan aplikasi di antara aplikasi tidak didukung. Gunakan satu kumpulan aplikasi per aplikasi.

  • Arsitektur (bitness) aplikasi dan runtime yang diinstal (x64 atau x86) harus cocok dengan arsitektur kumpulan aplikasi. Misalnya, aplikasi yang diterbitkan untuk 32-bit (x86) harus mengaktifkan 32-bit untuk Kumpulan Aplikasi IIS mereka. Untuk informasi lebih lanjut, lihat bagian Membuat situs IIS.

  • Pemutusan sambungan klien terdeteksi. Token HttpContext.RequestAborted pembatalan dibatalkan ketika klien terputus.

  • Saat menghosting dalam proses, AuthenticateAsync tidak dipanggil secara internal untuk menginisialisasi pengguna. Oleh karena itu, implementasi yang IClaimsTransformation digunakan untuk mengubah klaim setelah setiap autentikasi tidak diaktifkan secara default. Saat mengubah klaim dengan IClaimsTransformation implementasi, panggil AddAuthentication untuk menambahkan layanan autentikasi:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IClaimsTransformation, ClaimsTransformer>();
        services.AddAuthentication(IISServerDefaults.AuthenticationScheme);
    }
    
    public void Configure(IApplicationBuilder app)
    {
        app.UseAuthentication();
    }
    
  • Penyebaran Paket Web (file tunggal) tidak didukung.