IIS 및 ASP.NET Core를 사용하는 In Process 호스팅

In Process 호스팅은 IIS 작업자 프로세스와 동일한 프로세스에서 ASP.NET Core 앱을 실행합니다. 요청이 나가는 네트워크 트래픽을 동일한 머신에 다시 반환하는 네트워크 인터페이스인 루프백 어댑터를 통해 프록시되지 않기 때문에 In-Process 호스팅이 Out-of-Process 호스팅보다 향상된 성능을 제공합니다.

다음 다이어그램은 IIS, ASP.NET Core 모듈 및 In-Process에 호스트된 앱 간의 관계를 보여 줍니다.

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

In Process 호스팅 사용

ASP.NET Core 3.0 이후 In Process 호스팅은 IIS에 배포된 모든 앱에서 기본적으로 사용되었습니다.

In Process 호스팅을 위해 앱을 명시적으로 구성하려면 프로젝트 파일(.csproj)에서 <AspNetCoreHostingModel> 속성의 값을 InProcess로 설정합니다.

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

일반 아키텍처

요청의 일반적인 흐름은 다음과 같습니다.

  1. 요청은 웹에서 커널 모드 HTTP.sys 드라이버로 도착합니다.
  2. 드라이버는 웹 사이트의 구성된 포트[일반적으로 80(HTTP) 또는 443(HTTPS)]에서 IIS로 네이티브 요청을 라우팅합니다.
  3. ASP.NET Core 모듈에서는 기본 요청을 수신하고 IIS HTTP Server(IISHttpServer)에 전달합니다. IIS HTTP 서버는 네이티브 요청을 관리형 요청으로 변환하는 IIS의 In-process 서버를 구현한 것입니다.

IIS HTTP 서버에서 요청을 처리한 후:

  1. 해당 요청은 ASP.NET Core 미들웨어 파이프라인으로 전송됩니다.
  2. 미들웨어 파이프라인은 요청을 처리하고 앱의 논리에 HttpContext 인스턴스로 전달합니다.
  3. 앱의 응답은 IIS HTTP 서버를 통해 IIS로 다시 전달됩니다.
  4. IIS는 요청을 시작한 클라이언트에 응답을 보냅니다.

CreateDefaultBuilderUseIIS 메서드를 호출하여 CoreCLR을 부팅하고 IIS 작업자 프로세스(w3wp.exe 또는 iisexpress.exe) 내에서 앱을 호스트함으로써 IServer 인스턴스를 추가합니다. 성능 테스트의 결과는 .NET Core 앱 In-Process를 호스팅하는 것이 앱 Out-of-Process 및 Kestrel에 대한 요청을 프록시하는 것보다 훨씬 높은 요청 처리량을 제공함을 나타냅니다.

단일 실행 파일로 게시된 앱은 In Process 호스팅 모델을 통해 로드할 수 없습니다.

애플리케이션 구성

IIS 옵션을 구성하려면 IISServerOptions에 대한 서비스 구성을 Program.cs에 포함합니다. 다음 예제에서는 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();
옵션 기본값 설정
AutomaticAuthentication true true인 경우 IIS 서버는 Windows 인증에 의해 인증된 HttpContext.User를 설정합니다. false인 경우 서버는 HttpContext.User에 대한 ID만 제공하고, AuthenticationScheme에서 명시적으로 요청될 때 챌린지에 응답합니다. IIS에서 Windows 인증은 AutomaticAuthentication이 작동하기 위해 사용하도록 설정되어야 합니다. 자세한 내용은 Windows 인증을 참조하세요.
AuthenticationDisplayName null 로그인 페이지에서 사용자에게 나타나는 표시 이름을 설정합니다.
AllowSynchronousIO false HttpContext.RequestHttpContext.Response에 대해 동기 I/O가 허용되는지 여부를 나타냅니다.
MaxRequestBodySize 30000000 HttpRequest의 최대 요청 본문 크기를 가져오거나 설정합니다. IIS 자체에는 IISServerOptions에 설정된 MaxRequestBodySize 앞에 처리되는 maxAllowedContentLength 한도가 있습니다. MaxRequestBodySize를 변경해도 maxAllowedContentLength에 영향을 주지 않습니다. 늘리maxAllowedContentLength려면 더 높은 값으로 설정할 maxAllowedContentLength 항목을 web.config 추가합니다. 자세한 내용은 구성을 참조하세요.

In Process 호스트와 Out of Process의 차이점

다음 특성은 In-Process로 호스팅할 때 적용됩니다.

  • Kestrel 서버 대신 IIS HTTP 서버(IISHttpServer)가 사용됩니다. In Process인 경우 CreateDefaultBuilderUseIIS를 호출하여 다음을 수행합니다.

    • IISHttpServer를 등록합니다.
    • ASP.NET Core 모듈 뒤에서 실행될 때 서버가 수신 대기해야 하는 포트 및 기본 경로를 구성합니다.
    • 시작 오류를 캡처하도록 호스트를 구성합니다.
  • requestTimeout 특성은 In Process 호스팅에 적용되지 않습니다.

  • 앱 간의 앱 풀 공유는 지원되지 않습니다. 앱당 하나의 앱 풀을 사용합니다.

  • 앱 및 설치된 런타임(x64 또는 x86)의 아키텍처(비트)는 앱 풀의 아키텍처와 일치해야 합니다. 예를 들어 32비트(x86)용으로 게시된 앱은 해당 IIS 애플리케이션 풀에 대해 32비트를 사용하도록 설정해야 합니다. 자세한 내용은 IIS 사이트 만들기 섹션을 참조하세요.

  • 클라이언트의 연결 끊김이 검색되었습니다. 클라이언트의 연결이 끊어지면 HttpContext.RequestAborted 취소 토큰이 취소됩니다.

  • In-process로 호스팅하는 경우 사용자를 초기화하기 위해 AuthenticateAsync를 내부적으로 호출하지 않습니다. 따라서 모든 인증 후에 클레임을 변환하는 데 사용되는 IClaimsTransformation 구현은 기본적으로 활성화되지 않습니다. IClaimsTransformation 구현으로 클레임을 변환할 때 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();

타이밍 정보 가져오기

IHttpSysRequestTimingFeature를 사용하여 자세한 타이밍 정보 가져오기를 참조 하세요.

In Process 호스팅은 IIS 작업자 프로세스와 동일한 프로세스에서 ASP.NET Core 앱을 실행합니다. 요청이 나가는 네트워크 트래픽을 동일한 머신에 다시 반환하는 네트워크 인터페이스인 루프백 어댑터를 통해 프록시되지 않기 때문에 In-Process 호스팅이 Out-of-Process 호스팅보다 향상된 성능을 제공합니다.

다음 다이어그램은 IIS, ASP.NET Core 모듈 및 In-Process에 호스트된 앱 간의 관계를 보여 줍니다.

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

In Process 호스팅 사용

ASP.NET Core 3.0 이후 In Process 호스팅은 IIS에 배포된 모든 앱에서 기본적으로 사용되었습니다.

In Process 호스팅을 위해 앱을 명시적으로 구성하려면 프로젝트 파일(.csproj)에서 <AspNetCoreHostingModel> 속성의 값을 InProcess로 설정합니다.

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

일반 아키텍처

요청의 일반적인 흐름은 다음과 같습니다.

  1. 요청은 웹에서 커널 모드 HTTP.sys 드라이버로 도착합니다.
  2. 드라이버는 웹 사이트의 구성된 포트[일반적으로 80(HTTP) 또는 443(HTTPS)]에서 IIS로 네이티브 요청을 라우팅합니다.
  3. ASP.NET Core 모듈에서는 기본 요청을 수신하고 IIS HTTP Server(IISHttpServer)에 전달합니다. IIS HTTP 서버는 네이티브 요청을 관리형 요청으로 변환하는 IIS의 In-process 서버를 구현한 것입니다.

IIS HTTP 서버에서 요청을 처리한 후:

  1. 해당 요청은 ASP.NET Core 미들웨어 파이프라인으로 전송됩니다.
  2. 미들웨어 파이프라인은 요청을 처리하고 앱의 논리에 HttpContext 인스턴스로 전달합니다.
  3. 앱의 응답은 IIS HTTP 서버를 통해 IIS로 다시 전달됩니다.
  4. IIS는 요청을 시작한 클라이언트에 응답을 보냅니다.

CreateDefaultBuilderUseIIS 메서드를 호출하여 CoreCLR을 부팅하고 IIS 작업자 프로세스(w3wp.exe 또는 iisexpress.exe) 내에서 앱을 호스트함으로써 IServer 인스턴스를 추가합니다. 성능 테스트의 결과는 .NET Core 앱 In-Process를 호스팅하는 것이 앱 Out-of-Process 및 Kestrel에 대한 요청을 프록시하는 것보다 훨씬 높은 요청 처리량을 제공함을 나타냅니다.

단일 실행 파일로 게시된 앱은 In Process 호스팅 모델을 통해 로드할 수 없습니다.

애플리케이션 구성

IIS 옵션을 구성하려면 IISServerOptions에 대한 서비스 구성을 ConfigureServices에 포함합니다. 다음 예제에서는 AutomaticAuthentication을 사용하지 않도록 설정합니다.

services.Configure<IISServerOptions>(options => 
{
    options.AutomaticAuthentication = false;
});
옵션 기본값 설정
AutomaticAuthentication true true인 경우 IIS 서버는 Windows 인증에 의해 인증된 HttpContext.User를 설정합니다. false인 경우 서버는 HttpContext.User에 대한 ID만 제공하고, AuthenticationScheme에서 명시적으로 요청될 때 챌린지에 응답합니다. IIS에서 Windows 인증은 AutomaticAuthentication이 작동하기 위해 사용하도록 설정되어야 합니다. 자세한 내용은 Windows 인증을 참조하세요.
AuthenticationDisplayName null 로그인 페이지에서 사용자에게 나타나는 표시 이름을 설정합니다.
AllowSynchronousIO false HttpContext.RequestHttpContext.Response에 대해 동기 I/O가 허용되는지 여부를 나타냅니다.
MaxRequestBodySize 30000000 HttpRequest의 최대 요청 본문 크기를 가져오거나 설정합니다. IIS 자체에는 IISServerOptions에 설정된 MaxRequestBodySize 앞에 처리되는 maxAllowedContentLength 한도가 있습니다. MaxRequestBodySize를 변경해도 maxAllowedContentLength에 영향을 주지 않습니다. 늘리maxAllowedContentLength려면 더 높은 값으로 설정할 maxAllowedContentLength 항목을 web.config 추가합니다. 자세한 내용은 구성을 참조하세요.

In Process 호스트와 Out of Process의 차이점

다음 특성은 In-Process로 호스팅할 때 적용됩니다.

  • Kestrel 서버 대신 IIS HTTP 서버(IISHttpServer)가 사용됩니다. In Process인 경우 CreateDefaultBuilderUseIIS를 호출하여 다음을 수행합니다.

    • IISHttpServer를 등록합니다.
    • ASP.NET Core 모듈 뒤에서 실행될 때 서버가 수신 대기해야 하는 포트 및 기본 경로를 구성합니다.
    • 시작 오류를 캡처하도록 호스트를 구성합니다.
  • requestTimeout 특성은 In Process 호스팅에 적용되지 않습니다.

  • 앱 간의 앱 풀 공유는 지원되지 않습니다. 앱당 하나의 앱 풀을 사용합니다.

  • 앱 및 설치된 런타임(x64 또는 x86)의 아키텍처(비트)는 앱 풀의 아키텍처와 일치해야 합니다. 예를 들어 32비트(x86)용으로 게시된 앱은 해당 IIS 애플리케이션 풀에 대해 32비트를 사용하도록 설정해야 합니다. 자세한 내용은 IIS 사이트 만들기 섹션을 참조하세요.

  • 클라이언트의 연결 끊김이 검색되었습니다. 클라이언트의 연결이 끊어지면 HttpContext.RequestAborted 취소 토큰이 취소됩니다.

  • In-process로 호스팅하는 경우 사용자를 초기화하기 위해 AuthenticateAsync를 내부적으로 호출하지 않습니다. 따라서 모든 인증 후에 클레임을 변환하는 데 사용되는 IClaimsTransformation 구현은 기본적으로 활성화되지 않습니다. IClaimsTransformation 구현으로 클레임을 변환할 때 AddAuthentication을 호출하여 인증 서비스를 추가합니다.

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IClaimsTransformation, ClaimsTransformer>();
        services.AddAuthentication(IISServerDefaults.AuthenticationScheme);
    }
    
    public void Configure(IApplicationBuilder app)
    {
        app.UseAuthentication();
    }
    
  • 웹 패키지(단일 파일) 배포는 지원되지 않습니다.