IIS ve ASP.NET Core ile işlem içi barındırma

İşlem içi barındırma, iis çalışan işlemiyle aynı işlemde bir ASP.NET Core uygulaması çalıştırır. İşlem içi barındırma işlem dışı barındırmadan daha gelişmiş performans sağlar çünkü istekler, giden ağ trafiğini aynı makineye geri döndüren bir ağ arabirimi olan geri döngü bağdaştırıcısı üzerinden ara sunucu kullanmaz.

Aşağıdaki diyagramda IIS, ASP.NET Core Modülü ve işlem içinde barındırılan uygulama arasındaki ilişki gösterilir:

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

İşlem içi barındırmayı etkinleştirme

ASP.NET Core 3.0'dan bu yana, IIS'ye dağıtılan tüm uygulamalar için işlem içi barındırma varsayılan olarak etkinleştirilmiştir.

Bir uygulamayı işlem içi barındırma için açıkça yapılandırmak için, özelliğin <AspNetCoreHostingModel>InProcess değerini proje dosyasında (.csproj):

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

Genel mimari

bir isteğin genel akışı aşağıdaki gibidir:

  1. Web'den çekirdek modundaki HTTP.sys sürücüsüne bir istek gelir.
  2. Sürücü yerel isteği web sitesinin yapılandırılmış bağlantı noktası üzerinden (genellikle 80 (HTTP) veya 443 (HTTPS)) IIS'ye yönlendirir.
  3. ASP.NET Core Modülü yerel isteği alır ve IIS HTTP Sunucusuna (IISHttpServer) geçirir. IIS HTTP Sunucusu, IIS için isteği yerelden yönetilene dönüştüren bir işlem içi sunucu uygulamasıdır.

IIS HTTP Sunucusu isteği işledikten sonra:

  1. İstek ASP.NET Core ara yazılım işlem hattına gönderilir.
  2. Ara yazılım işlem hattı isteği işler ve bir HttpContext örneği olarak uygulamanın mantığına geçirir.
  3. Uygulamanın yanıtı IIS HTTP Sunucusu üzerinden geriye IIS'ye geçirilir.
  4. IIS bu yanıtı, isteği başlatan istemciye gönderir.

CreateDefaultBuilder, UseIIS yöntemini çağırıp CoreCLR önyüklemesi yaparak bir IServer örneği ekler ve uygulamayı IIS çalışan işleminin (w3wp.exe veya iisexpress.exe) içinde barındırır. Performans testleri bir .NET Core uygulamasını işlem içinde barındırmanın, uygulamayı işlem dışında barındırıp istekleri Kestrel yoluna ara sunucuyla yönlendirmeye göre önemli ölçüde yüksek bir istek aktarım hızı sağladığını gösterir.

Tek bir yürütülebilir dosya olarak yayımlanan uygulamalar işlem içi barındırma modeliyle yüklenemez.

Uygulama yapılandırması

IIS seçeneklerini yapılandırmak için Program.cs yönteminde IISServerOptions için bir hizmet yapılandırması ekleyin. Aşağıdaki örnek devre dışı bırakır 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();
Seçenek Varsayılan Ayar
AutomaticAuthentication true true olduğunda, IIS Sunucusu HttpContext.User özelliğini Windows Kimlik Doğrulaması tarafından kimliği doğrulanmış olarak ayarlar. false olduğunda, sunucu yalnızca HttpContext.User için bir kimlik sağlar ve AuthenticationScheme tarafından açıkça istendiğinde sınamaları yanıtlar. AutomaticAuthentication'ın çalışması için IIS'de Windows Kimlik Doğrulaması'nın etkinleştirilmesi gerekir. Daha fazla bilgi için bkz. Windows Kimlik Doğrulaması.
AuthenticationDisplayName null Oturum açma sayfalarında kullanıcılara gösterilen görünen adı ayarlar.
AllowSynchronousIO false HttpContext.Request ve HttpContext.Response için zaman uyumlu G/Ç'ye izin verilip verilmediği.
MaxRequestBodySize 30000000 HttpRequest için maksimum istek gövdesi boyutunu alır veya ayarlar. IIS'nin kendi maxAllowedContentLength sınırı olduğunu ve bu sınırın IISServerOptions içinde ayarlanan MaxRequestBodySize özelliğinden önce işleneceğini unutmayın. MaxRequestBodySize özelliğinin değiştirilmesi maxAllowedContentLength sınırını etkilemez. maxAllowedContentLength değerini artırmak için web.config dosyasına bir girdi ekleyerek maxAllowedContentLength için daha yüksek bir değer ayarlayın. Diğer ayrıntılar için bkz. Yapılandırma.

İşlem içi ve işlem dışı barındırma arasındaki farklar

İşlemde barındırma sırasında aşağıdaki özellikler geçerlidir:

  • IIS HTTP Sunucusu (IISHttpServer), sunucu yerine Kestrel kullanılır. İşlem sırasında şu CreateDefaultBuilder çağrılar UseIIS yapılır:

    • öğesini IISHttpServerkaydedin.
    • ASP.NET Çekirdek Modülü arkasında çalışırken sunucunun dinlemesi gereken bağlantı noktasını ve temel yolu yapılandırın.
    • Başlangıç hatalarını yakalamak için konağı yapılandırın.
  • requestTimeout özniteliği, işlem içi barındırma için geçerli değildir.

  • Uygulamalar arasında uygulama havuzu paylaşımı desteklenmez. Uygulama başına bir uygulama havuzu kullanın.

  • Uygulamanın ve yüklü çalışma zamanının mimarisi (bitlik) (x64 veya x86) uygulama havuzunun mimarisiyle eşleşmelidir. Örneğin, 32 bit (x86) için yayımlanan uygulamaların IIS Uygulama Havuzları için 32 bit etkinleştirilmiş olması gerekir. Daha fazla bilgi için IIS sitesi oluşturma bölümüne bakın.

  • İstemci bağlantısı kesiliyor algılandı. İstemci HttpContext.RequestAborted bağlantısı kesildiğinde iptal belirteci iptal edilir.

  • İşlem içinde barındırılırken, AuthenticateAsync bir kullanıcıyı başlatmak için dahili olarak çağrılmaz. Bu nedenle, her kimlik doğrulamasından sonra talepleri dönüştürmek için kullanılan bir IClaimsTransformation uygulama varsayılan olarak etkinleştirilmez. Talepleri bir IClaimsTransformation uygulamayla dönüştürürken, kimlik doğrulama hizmetleri eklemek için çağrısı AddAuthentication :

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();

Zamanlama bilgilerini alma

Bkz . IHttpSysRequestTimingFeature ile ayrıntılı zamanlama bilgilerini alma.

İşlem içi barındırma, iis çalışan işlemiyle aynı işlemde bir ASP.NET Core uygulaması çalıştırır. İşlem içi barındırma işlem dışı barındırmadan daha gelişmiş performans sağlar çünkü istekler, giden ağ trafiğini aynı makineye geri döndüren bir ağ arabirimi olan geri döngü bağdaştırıcısı üzerinden ara sunucu kullanmaz.

Aşağıdaki diyagramda IIS, ASP.NET Core Modülü ve işlem içinde barındırılan uygulama arasındaki ilişki gösterilir:

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

İşlem içi barındırmayı etkinleştirme

ASP.NET Core 3.0'dan bu yana, IIS'ye dağıtılan tüm uygulamalar için işlem içi barındırma varsayılan olarak etkinleştirilmiştir.

Bir uygulamayı işlem içi barındırma için açıkça yapılandırmak için, özelliğin <AspNetCoreHostingModel>InProcess değerini proje dosyasında (.csproj):

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

Genel mimari

bir isteğin genel akışı aşağıdaki gibidir:

  1. Web'den çekirdek modundaki HTTP.sys sürücüsüne bir istek gelir.
  2. Sürücü yerel isteği web sitesinin yapılandırılmış bağlantı noktası üzerinden (genellikle 80 (HTTP) veya 443 (HTTPS)) IIS'ye yönlendirir.
  3. ASP.NET Core Modülü yerel isteği alır ve IIS HTTP Sunucusuna (IISHttpServer) geçirir. IIS HTTP Sunucusu, IIS için isteği yerelden yönetilene dönüştüren bir işlem içi sunucu uygulamasıdır.

IIS HTTP Sunucusu isteği işledikten sonra:

  1. İstek ASP.NET Core ara yazılım işlem hattına gönderilir.
  2. Ara yazılım işlem hattı isteği işler ve bir HttpContext örneği olarak uygulamanın mantığına geçirir.
  3. Uygulamanın yanıtı IIS HTTP Sunucusu üzerinden geriye IIS'ye geçirilir.
  4. IIS bu yanıtı, isteği başlatan istemciye gönderir.

CreateDefaultBuilder, UseIIS yöntemini çağırıp CoreCLR önyüklemesi yaparak bir IServer örneği ekler ve uygulamayı IIS çalışan işleminin (w3wp.exe veya iisexpress.exe) içinde barındırır. Performans testleri bir .NET Core uygulamasını işlem içinde barındırmanın, uygulamayı işlem dışında barındırıp istekleri Kestrel yoluna ara sunucuyla yönlendirmeye göre önemli ölçüde yüksek bir istek aktarım hızı sağladığını gösterir.

Tek bir yürütülebilir dosya olarak yayımlanan uygulamalar işlem içi barındırma modeliyle yüklenemez.

Uygulama yapılandırması

IIS seçeneklerini yapılandırmak için ConfigureServices yönteminde IISServerOptions için bir hizmet yapılandırması ekleyin. Aşağıdaki örnek AutomaticAuthentication özelliğini devre dışı bırakır:

services.Configure<IISServerOptions>(options => 
{
    options.AutomaticAuthentication = false;
});
Seçenek Varsayılan Ayar
AutomaticAuthentication true true olduğunda, IIS Sunucusu HttpContext.User özelliğini Windows Kimlik Doğrulaması tarafından kimliği doğrulanmış olarak ayarlar. false olduğunda, sunucu yalnızca HttpContext.User için bir kimlik sağlar ve AuthenticationScheme tarafından açıkça istendiğinde sınamaları yanıtlar. AutomaticAuthentication'ın çalışması için IIS'de Windows Kimlik Doğrulaması'nın etkinleştirilmesi gerekir. Daha fazla bilgi için bkz. Windows Kimlik Doğrulaması.
AuthenticationDisplayName null Oturum açma sayfalarında kullanıcılara gösterilen görünen adı ayarlar.
AllowSynchronousIO false HttpContext.Request ve HttpContext.Response için zaman uyumlu G/Ç'ye izin verilip verilmediği.
MaxRequestBodySize 30000000 HttpRequest için maksimum istek gövdesi boyutunu alır veya ayarlar. IIS'nin kendi maxAllowedContentLength sınırı olduğunu ve bu sınırın IISServerOptions içinde ayarlanan MaxRequestBodySize özelliğinden önce işleneceğini unutmayın. MaxRequestBodySize özelliğinin değiştirilmesi maxAllowedContentLength sınırını etkilemez. maxAllowedContentLength değerini artırmak için web.config dosyasına bir girdi ekleyerek maxAllowedContentLength için daha yüksek bir değer ayarlayın. Diğer ayrıntılar için bkz. Yapılandırma.

İşlem içi ve işlem dışı barındırma arasındaki farklar

İşlemde barındırma sırasında aşağıdaki özellikler geçerlidir:

  • IIS HTTP Sunucusu (IISHttpServer), sunucu yerine Kestrel kullanılır. İşlem sırasında şu CreateDefaultBuilder çağrılar UseIIS yapılır:

    • öğesini IISHttpServerkaydedin.
    • ASP.NET Çekirdek Modülü arkasında çalışırken sunucunun dinlemesi gereken bağlantı noktasını ve temel yolu yapılandırın.
    • Başlangıç hatalarını yakalamak için konağı yapılandırın.
  • requestTimeout özniteliği, işlem içi barındırma için geçerli değildir.

  • Uygulamalar arasında uygulama havuzu paylaşımı desteklenmez. Uygulama başına bir uygulama havuzu kullanın.

  • Uygulamanın ve yüklü çalışma zamanının mimarisi (bitlik) (x64 veya x86) uygulama havuzunun mimarisiyle eşleşmelidir. Örneğin, 32 bit (x86) için yayımlanan uygulamaların IIS Uygulama Havuzları için 32 bit etkinleştirilmiş olması gerekir. Daha fazla bilgi için IIS sitesi oluşturma bölümüne bakın.

  • İstemci bağlantısı kesiliyor algılandı. İstemci HttpContext.RequestAborted bağlantısı kesildiğinde iptal belirteci iptal edilir.

  • İşlem içinde barındırılırken, AuthenticateAsync bir kullanıcıyı başlatmak için dahili olarak çağrılmaz. Bu nedenle, her kimlik doğrulamasından sonra talepleri dönüştürmek için kullanılan bir IClaimsTransformation uygulama varsayılan olarak etkinleştirilmez. Talepleri bir IClaimsTransformation uygulamayla dönüştürürken, kimlik doğrulama hizmetleri eklemek için çağrısı AddAuthentication :

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IClaimsTransformation, ClaimsTransformer>();
        services.AddAuthentication(IISServerDefaults.AuthenticationScheme);
    }
    
    public void Configure(IApplicationBuilder app)
    {
        app.UseAuthentication();
    }
    
  • Web Paketi (tek dosyalı) dağıtımlar desteklenmez.