ASP.NET Core 응용 프로그램 시작Application startup in ASP.NET Core

Steve Smith, Tom Dykstra, 및 Luke LathamBy Steve Smith, Tom Dykstra, and Luke Latham

Startup 클래스 서비스 및 응용 프로그램의 요청 파이프라인을 구성 합니다.The Startup class configures services and the app's request pipeline.

시작 클래스입니다.The Startup class

ASP.NET Core 응용 프로그램 사용을 Startup 클래스 이름으로 지정 된 Startup 규칙에 따라 합니다.ASP.NET Core apps use a Startup class, which is named Startup by convention. Startup 클래스:The Startup class:

  • 선택적으로 포함할 수는 ConfigureServices 응용 프로그램의 서비스를 구성 하는 메서드.Can optionally include a ConfigureServices method to configure the app's services.
  • 포함 되어야 합니다는 구성 방법을 응용 프로그램의 요청 처리 파이프라인을 만들 수 있습니다.Must include a Configure method to create the app's request processing pipeline.

ConfigureServicesConfigure 앱 시작 시 런타임에 의해 호출 됩니다.ConfigureServices and Configure are called by the runtime when the app starts:

public class Startup
{
    // Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        ...
    }

    // Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app)
    {
        ...
    }
}

지정 된 Startup 클래스와 WebHostBuilderExtensions UseStartup<TStartup> 메서드:Specify the Startup class with the WebHostBuilderExtensions UseStartup<TStartup> method:

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

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

Startup 클래스 생성자는 호스트에 의해 정의 된 종속성을 허용 합니다.The Startup class constructor accepts dependencies defined by the host. 일반적인 용도 종속성 주입Startup 클래스를 삽입 하는 IHostingEnvironment 환경에서 서비스를 구성 하려면:A common use of dependency injection into the Startup class is to inject IHostingEnvironment to configure services by environment:

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

    public IHostingEnvironment HostingEnvironment { get; }

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

삽입 하는 대신 IHostingStartup 규칙 기반 접근 방식을 사용 하는 것입니다.An alternative to injecting IHostingStartup is to use a conventions-based approach. 응용 프로그램을 별도 정의할 수 Startup 다양 한 환경에 대 한 클래스 (예를 들어 StartupDevelopment), 적절 한 시작 클래스는 런타임에 선택 됩니다.The app can define separate Startup classes for different environments (for example, StartupDevelopment), and the appropriate startup class is selected at runtime. 해당 이름 접미사는 현재 환경에 적합 한 클래스 우선 순위가 부여 됩니다.The class whose name suffix matches the current environment is prioritized. 응용 프로그램 개발 환경에서 실행 되 고 모두를 포함 하는 경우는 Startup 클래스 및 StartupDevelopment 클래스는 StartupDevelopment 클래스가 사용 됩니다.If the app is run in the Development environment and includes both a Startup class and a StartupDevelopment class, the StartupDevelopment class is used. 자세한 내용은 참조 여러 환경 작업합니다.For more information see Working with multiple environments.

에 대 한 자세한 내용은 WebHostBuilder, 참조는 호스팅 항목입니다.To learn more about WebHostBuilder, see the Hosting topic. 시작 하는 동안 오류를 처리 하는 방법은 참조 하십시오. 시작 예외 처리합니다.For information on handling errors during startup, see Startup exception handling.

ConfigureServices 메서드The ConfigureServices method

ConfigureServices 방법은:The ConfigureServices method is:

  • 선택 사항입니다.Optional.
  • 하기 전에 웹 호스트에 의해 호출 된 Configure 응용 프로그램의 서비스를 구성 하는 메서드.Called by the web host before the Configure method to configure the app's services.
  • 여기서 구성 옵션 규칙에 의해 설정 됩니다.Where configuration options are set by convention.

서비스 컨테이너에 서비스 추가 사용할 수 있도록 응용 프로그램 내에서 Configure 메서드.Adding services to the service container makes them available within the app and in the Configure method. 서비스는를 통해 확인 종속성 주입 또는 IApplicationBuilder.ApplicationServices합니다.The services are resolved via dependency injection or from IApplicationBuilder.ApplicationServices.

웹 호스트 되기 전에 일부 서비스를 구성할 수 있습니다 Startup 메서드가 호출 됩니다.The web host may configure some services before Startup methods are called. 사용할 수 있는 세부 정보는 호스팅 항목입니다.Details are available in the Hosting topic.

상당한 설치 해야 하는 기능을 위해 가지 Add[Service] 에 확장 메서드 IServiceCollection합니다.For features that require substantial setup, there are Add[Service] extension methods on IServiceCollection. Entity Framework, Id 및 MVC에 대 한 서비스를 등록 하는 일반적인 웹 앱:A typical web app registers services for Entity Framework, Identity, and MVC:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc();

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
}

시작에 사용할 수 있는 서비스Services available in Startup

에 사용할 수 있는 몇 가지 서비스를 제공 하는 웹 호스트는 Startup 클래스 생성자입니다.The web host provides some services that are available to the Startup class constructor. 응용 프로그램을 통해 추가 서비스를 추가 합니다. ConfigureServices합니다.The app adds additional services via ConfigureServices. 호스트와 응용 프로그램 서비스에서 사용할 수 있는 다음 Configure 및 응용 프로그램에 걸쳐 있습니다.Both the host and app services are then available in Configure and throughout the application.

Configure 메서드The Configure method

구성 메서드를 사용 하는 응용 프로그램 HTTP 요청에 응답 하는 방식을 지정 합니다.The Configure method is used to specify how the app responds to HTTP requests. 요청 파이프라인을 추가 하 여 구성할 미들웨어 구성 요소는 IApplicationBuilder 인스턴스.The request pipeline is configured by adding middleware components to an IApplicationBuilder instance. IApplicationBuilder사용할 수는 Configure 하지만 메서드를 서비스 컨테이너에 등록 되지 않았습니다.IApplicationBuilder is available to the Configure method, but it isn't registered in the service container. 호스팅 만듭니다는 IApplicationBuilder 에 직접 전달 Configure (참조 소스).Hosting creates an IApplicationBuilder and passes it directly to Configure (reference source).

ASP.NET Core 템플릿 개발자 예외 페이지를 지 원하는 파이프라인을 구성 BrowserLink, 오류 페이지, 정적 파일 및 ASP.NET MVC:The ASP.NET Core templates configure the pipeline with support for a developer exception page, BrowserLink, error pages, static files, and ASP.NET MVC:

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

    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller}/{action=Index}/{id?}");
    });
}

Use 확장 메서드는 요청 파이프라인에 미들웨어 구성 요소를 추가 합니다.Each Use extension method adds a middleware component to the request pipeline. 예를 들어,는 UseMvc 추가 하는 확장 메서드는 라우팅 미들웨어 요청 파이프라인을 구성 및 MVC 기본 처리기로 합니다.For instance, the UseMvc extension method adds the routing middleware to the request pipeline and configures MVC as the default handler.

추가 서비스와 같은 IHostingEnvironmentILoggerFactory, 메서드 서명에서 지정할 수도 있습니다.Additional services, such as IHostingEnvironment and ILoggerFactory, may also be specified in the method signature. 을 지정 하면 사용 가능한 경우 추가 서비스는 삽입 합니다.When specified, additional services are injected if they're available.

사용 하는 방법에 대 한 자세한 내용은 IApplicationBuilder, 참조 미들웨어합니다.For more information on how to use IApplicationBuilder, see Middleware.

편리한 메서드Convenience methods

ConfigureServices구성 편의 메서드를 지정 하는 대신 사용할 수는 Startup 클래스입니다.ConfigureServices and Configure convenience methods can be used instead of specifying a Startup class. 여러 번 호출 ConfigureServices 서로에 추가 합니다.Multiple calls to ConfigureServices append to one another. 여러 번 호출 Configure 마지막 메서드 호출을 사용 합니다.Multiple calls to Configure use the last method call.

public class Program
{
    public static IHostingEnvironment HostingEnvironment { get; set; }

    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                HostingEnvironment = hostingContext.HostingEnvironment;
            })
            .ConfigureServices(services =>
            {
                services.AddMvc();
            })
            .Configure(app =>
            {
                if (HostingEnvironment.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseExceptionHandler("/Error");
                }

                app.UseMvcWithDefaultRoute();
                app.UseStaticFiles();
            })
            .Build();
}

시작 필터Startup filters

사용 하 여 IStartupFilter 미들웨어를 구성 하는 시작 이나 끝 응용 프로그램의 구성 미들웨어 파이프라인.Use IStartupFilter to configure middleware at the beginning or end of an app's Configure middleware pipeline. IStartupFilter미들웨어 실행 전이나 후 라이브러리 시작 부분이 나 끝의 응용 프로그램의 요청 처리 파이프라인에 의해 추가 되는 미들웨어 되도록 유용 합니다.IStartupFilter is useful to ensure that a middleware runs before or after middleware added by libraries at the start or end of the app's request processing pipeline.

IStartupFilter단일 메서드를 구현 구성를 받아서 반환 하는 프로그램 Action<IApplicationBuilder>합니다.IStartupFilter implements a single method, Configure, which receives and returns an Action<IApplicationBuilder>. IApplicationBuilder 는 응용 프로그램의 요청 파이프라인을 구성 하는 클래스를 정의 합니다.An IApplicationBuilder defines a class to configure an app's request pipeline. 자세한 내용은 참조 IApplicationBuilder 미들웨어 파이프라인 만들기합니다.For more information, see Creating a middleware pipeline with IApplicationBuilder.

IStartupFilter 요청 파이프라인에서 하나 이상의 middlewares를 구현 합니다.Each IStartupFilter implements one or more middlewares in the request pipeline. 필터는 서비스 컨테이너에 추가 된 순서 대로 호출 됩니다.The filters are invoked in the order they were added to the service container. 미들웨어 하기 전에 행 필터를 추가할 수 있습니다 또는 제어 하 여 다음 필터를 통과 했으면 따라서은 추가 시작 또는 응용 프로그램 파이프라인의 끝에 있습니다.Filters may add middleware before or after passing control to the next filter, thus they append to the beginning or end of the app pipeline.

샘플 응용 프로그램 (다운로드 하는 방법을) 사용 하 여 미들웨어를 등록 하는 방법을 보여 줍니다. IStartupFilter합니다.The sample app (how to download) demonstrates how to register a middleware with IStartupFilter. 샘플 응용 프로그램에서 쿼리 문자열 매개 변수 옵션 값을 설정 하는 미들웨어를 포함 되어 있습니다.The sample app includes a middleware that sets an options value from a query string parameter:

public class RequestSetOptionsMiddleware
{
    private readonly RequestDelegate _next;
    private IOptions<AppOptions> _injectedOptions;

    public RequestSetOptionsMiddleware(
        RequestDelegate next, IOptions<AppOptions> injectedOptions)
    {
        _next = next;
        _injectedOptions = injectedOptions;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        Console.WriteLine("RequestSetOptionsMiddleware.Invoke");

        var option = httpContext.Request.Query["option"];

        if (!string.IsNullOrWhiteSpace(option))
        {
            _injectedOptions.Value.Option = WebUtility.HtmlEncode(option);
        }

        await _next(httpContext);
    }
}

RequestSetOptionsMiddleware 에 구성 된 RequestSetOptionsStartupFilter 클래스:The RequestSetOptionsMiddleware is configured in the RequestSetOptionsStartupFilter class:

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

IStartupFilter 서비스 컨테이너에에 등록 되어 ConfigureServices:The IStartupFilter is registered in the service container in ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IStartupFilter, RequestSetOptionsStartupFilter>();
    services.AddMvc();
}

경우에 대 한 쿼리 문자열 매개 변수 option MVC 미들웨어의 응답을 렌더링 하기 전에 값 할당을 처리 하는 미들웨어 제공 됩니다.When a query string parameter for option is provided, the middleware processes the value assignment before the MVC middleware renders the response:

브라우저 창에 렌더링된 된 인덱스 페이지를 표시 합니다.

순서 여 미들웨어 실행 순서 설정 되어 IStartupFilter 등록:Middleware execution order is set by the order of IStartupFilter registrations:

  • 여러 IStartupFilter 구현을 동일한 개체를 조작할 수 있습니다.Multiple IStartupFilter implementations may interact with the same objects. 정렬 순서가 중요 한 경우 해당 IStartupFilter 서비스 자신의 middlewares 실행 해야 하는 순서와 일치 하도록 등록 합니다.If ordering is important, order their IStartupFilter service registrations to match the order that their middlewares should run.
  • 라이브러리에서 하나 이상의 미들웨어를 추가할 수 있습니다. IStartupFilter 전 또는 다른 응용 프로그램 미들웨어에 등록 한 후에 실행 하는 구현 IStartupFilter합니다.Libraries may add middleware with one or more IStartupFilter implementations that run before or after other app middleware registered with IStartupFilter. 호출 하는 IStartupFilter 미들웨어는 라이브러리에 의해 추가 하기 전에 미들웨어 IStartupFilter, 라이브러리 서비스 컨테이너에 추가 되기 전에 서비스 등록 위치를 지정 합니다.To invoke an IStartupFilter middleware before a middleware added by a library's IStartupFilter, position the service registration before the library is added to the service container. 라이브러리를 추가한 후 나중에 호출할 서비스 등록을 배치 합니다.To invoke it afterward, position the service registration after the library is added.

추가 리소스Additional resources