Запуск приложения в ASP.NET Core

Note

Это не последняя версия этой статьи. В текущей версии см. версию .NET 10 этой статьи.

Warning

Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущей версии см. версию .NET 10 этой статьи.

Автор: Рик Андерсон (Rick Anderson)

ASP.NET Core приложения, созданные с помощью веб-шаблонов, содержат код запуска приложения в файле Program.cs.

Руководство по запуску , которое добавляет или заменяет рекомендации, приведенные в этой статье, см. ASP.NET Core startup.

Следующий код запуска приложения поддерживает несколько типов приложений:

using WebAll.Components;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();
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.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

app.UseAntiforgery();

app.Run();

Приложения, использующие EventSource этот параметр, могут измерять время запуска, чтобы понять и оптимизировать производительность запуска. Событие ServerReady в Microsoft.AspNetCore.Hosting представляет точку, в которой сервер готов отвечать на запросы.

Расширение класса Startup с использованием фильтров запуска

Используйте IStartupFilter в следующих случаях:

  • Чтобы настроить посредническое программное обеспечение в начале или конце конвейера посреднического программного обеспечения приложения без явного вызова Use{Middleware}. Используйте IStartupFilter для добавления значений по умолчанию в начало конвейера без явной регистрации промежуточного программного обеспечения по умолчанию. IStartupFilter разрешает другим компонентам вызывать Use{Middleware} от имени автора приложения.

  • Для создания конвейера методов Configure. IStartupFilter.Configure может установить посредник, который будет запускаться до или после посредников, добавляемых библиотеками.

Реализация IStartupFilter предоставляет Configure метод, который получает и возвращает действие<IApplicationBuilder>. IApplicationBuilder определяет класс для настройки конвейера запросов приложения. Дополнительные сведения см. в разделе Создание конвейера ПО промежуточного слоя с помощью IApplicationBuilder.

Каждая реализация IStartupFilter может добавлять одно или несколько ПО промежуточного слоя в конвейер запросов. Фильтры вызываются в том порядке, в котором они были добавлены в контейнер службы. Фильтры могут добавлять промежуточное программное обеспечение до или после передачи управления в следующий фильтр, и поэтому они добавляются в начало или конец конвейера приложения.

В следующем примере показана регистрация ПО промежуточного слоя с помощью IStartupFilter. ПО промежуточного слоя RequestSetOptionsMiddleware задает значения параметров из параметра строки запроса:

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

RequestSetOptionsMiddleware настраивается в классе RequestSetOptionsStartupFilter:

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

Реализация IStartupFilter регистрируется в файле Program.cs :

using WebStartup.Middleware;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddTransient<IStartupFilter,
                      RequestSetOptionsStartupFilter>();

var app = builder.Build();

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

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Если указан параметр строки запроса для option, промежуточное ПО обрабатывает назначение значений до того, как промежуточное ПО ASP.NET Core отобразит ответ.

@page
@model PrivacyModel
@{
    ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>

<p> Append query string ?option=hello</p>
Option String: @HttpContext.Items["option"];

Порядок выполнения ПО промежуточного слоя определяется порядком регистраций IStartupFilter:

  • Несколько реализаций IStartupFilter могут взаимодействовать с теми же объектами. Если важен порядок, упорядочите регистрации службы IStartupFilter в соответствии с требуемым порядком выполнения ПО промежуточного слоя.

  • Библиотеки могут добавлять ПО промежуточного слоя с одной или несколькими реализациями IStartupFilter, которые выполняются до или после других программ промежуточного слоя приложений, зарегистрированных в IStartupFilter. Чтобы вызвать промежуточное ПО IStartupFilter перед промежуточным ПО, добавленным библиотекой IStartupFilter, выполните следующие действия:

    • расположите регистрацию сервиса перед добавлением библиотеки в контейнер сервисов.

    • Чтобы вызвать позднее, расположите регистрацию службы после добавления библиотеки.

Вы не можете расширить приложение ASP.NET Core при переопределении Configure. Дополнительные сведения см. в разделе GitHub /dotnet/aspnetcore/issues #45372.

Добавление конфигурации из внешней сборки при запуске

Реализация IHostingStartup позволяет добавлять улучшения в приложение при запуске из внешней сборки за пределами файла Program.cs приложения. Дополнительную информацию см. в статье Использование начальных сборок для размещения в ASP.NET Core.

Инициализация, ConfigureServices и настройка

Сведения об использовании методов ConfigureServices и Configure с минимальной моделью размещения см. в следующей статье:

Приложения ASP.NET Core, созданные на основе веб-шаблонов, содержат код запуска приложения в файле Program.cs.

Следующий код запуска приложения поддерживает:

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

Дополнительные сведения о запуске приложения см. в статье Основы ASP.NET Core.

Расширение Startup с использованием фильтров запуска

Используйте IStartupFilter в следующих случаях:

  • Чтобы настроить посредствующий слой в начале или конце конвейера промежуточного слоя приложения без явного вызова Use{Middleware}. Используйте IStartupFilter для добавления значений по умолчанию в начало конвейера без явной регистрации промежуточного ПО по умолчанию. IStartupFilter разрешает другим компонентам вызывать Use{Middleware} от имени автора приложения.
  • Для создания конвейера методов Configure. IStartupFilter.Configure может запускать промежуточное ПО до или после промежуточного ПО, добавляемого библиотеками.

IStartupFilter реализует метод Configure, который принимает и возвращает Action<IApplicationBuilder>. IApplicationBuilder определяет класс для настройки конвейера запросов приложения. Дополнительные сведения см. в разделе Создание конвейера ПО промежуточного слоя с помощью IApplicationBuilder.

Каждый IStartupFilter может добавлять одно или несколько промежуточных ПО в конвейер запросов. Фильтры вызываются в том порядке, в котором они были добавлены в контейнер службы. Фильтры могут добавлять ПО промежуточного слоя до или после передачи управления следующему фильтру, поэтому они добавляются в начало или конец конвейера приложения.

В следующем примере показана регистрация ПО промежуточного слоя с помощью IStartupFilter. ПО промежуточного слоя RequestSetOptionsMiddleware задает значения параметров из параметра строки запроса:

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

RequestSetOptionsMiddleware настраивается в классе RequestSetOptionsStartupFilter:

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

IStartupFilter зарегистрировано в Program.cs:

using WebStartup.Middleware;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddTransient<IStartupFilter,
                      RequestSetOptionsStartupFilter>();

var app = builder.Build();

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

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Если указан параметр строки запроса option, Промежуточное ПО обрабатывает назначение значений перед тем, как ASP.NET Core формирует ответ.

@page
@model PrivacyModel
@{
    ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>

<p> Append query string ?option=hello</p>
Option String: @HttpContext.Items["option"];

Порядок выполнения ПО промежуточного слоя определяется порядком регистраций IStartupFilter:

  • Несколько реализаций IStartupFilter могут взаимодействовать с одними и теми же объектами. Если важен порядок, упорядочите регистрации сервисов IStartupFilter согласно порядку работы их промежуточного ПО.

  • Библиотеки могут добавлять ПО промежуточного слоя с одной или несколькими реализациями IStartupFilter, которые выполняются до или после другого ПО промежуточного слоя приложения, зарегистрированного с помощью IStartupFilter. Чтобы вызвать промежуточное ПО IStartupFilter перед промежуточным ПО, добавляемым библиотекой IStartupFilter, сделайте следующее:

    • Сначала выполните регистрацию службы перед добавлением библиотеки в контейнер служб.
    • Чтобы вызвать позже, расположите регистрацию службы после добавления библиотеки.

Примечание. Вы не можете расширить приложение ASP.NET Core при переопределении Configure. Дополнительные сведения см. здесь на GitHub.

Добавление конфигурации из внешней сборки при запуске

Реализация IHostingStartup позволяет добавлять улучшения в приложение при запуске из внешней сборки за пределами файла приложения Program.cs . Дополнительную информацию см. в статье Использование начальных сборок для размещения в ASP.NET Core.

Класс Startup настраивает службы и конвейер запросов приложения.

Класс Startup

Приложения ASP.NET Core используют класс Startup, который называется Startup по соглашению . Класс Startup:

  • При необходимости содержит метод ConfigureServices для настройки служб приложения. Служба — многократно используемый компонент, обеспечивающий функциональность приложения. Службы регистрируются в ConfigureServices и используются в приложении с помощью внедрения зависимостей (DI) или ApplicationServices.
  • Содержит метод Configure для создания конвейера обработки запросов приложения.

ConfigureServices и Configure вызываются средой выполнения ASP.NET Core при запуске приложения:

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

Предыдущий пример предназначен для Razor Pages; версия для MVC похожа.

Класс Startup указывается при создании узла приложения. Класс Startup обычно указывается путем вызова метода WebHostBuilderExtensions.UseStartup/<TStartup> в построителе узлов.

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

Хост предоставляет сервисы, которые доступны конструктору класса Startup. Приложение добавляет дополнительные службы через ConfigureServices. Как службы узла, так и службы приложения доступны в Configure и во всем приложении.

Только следующие типы служб могут внедряться в конструктор Startup, когда используется Generic Host (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
        {
        }
    }
}

Большинство служб недоступны, пока не будет вызван метод Configure.

Несколько запусков

Когда приложение определяет отдельные классы Startup для различных сред (например, StartupDevelopment), подходящий класс Startup выбирается во время выполнения. Класс, у которого суффикс имени соответствует текущей среде, получает приоритет. Если приложение выполняется в Development среде и включает как Startup класс, так и StartupDevelopment класс, используется StartupDevelopment класс. Дополнительные сведения см. в статье Использование нескольких сред.

Для получения дополнительной информации о хосте, см. раздел Хост. Сведения об обработке ошибок во время запуска см. в разделе Обработка исключений при запуске.

Метод ConfigureServices

Метод ConfigureServices:

  • Optional.
  • Вызывается хостом перед методом Configure для настройки служб приложения.
  • Настройка параметров конфигурации выполняется по соглашению.

Хост может настраивать некоторые службы перед вызовом методов Startup. Дополнительную информацию см. в разделе Хост.

Для функций, нуждающихся в значительной настройке, существуют методы расширения Add{Service} в IServiceCollection. Например, AddDbContext, AddDefaultIdentity, AddEntityFrameworkStores и AddRazorPages:

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

Добавление служб в контейнер службы делает их доступными в приложении и методе Configure. Службы разрешаются посредством внедрения зависимостей или из ApplicationServices.

Метод конфигурирования

Метод Configure используется для указания того, как приложение реагирует на HTTP-запросы. Конвейер запросов настраивается путем добавления компонентов промежуточного программного обеспечения (middleware) в экземпляр IApplicationBuilder. IApplicationBuilder доступен для метода Configure, но он не зарегистрирован в контейнере службы. Когда хостинг создаёт IApplicationBuilder, он передаёт его непосредственно в Configure.

Шаблоны ASP.NET Core настраивают конвейер с поддержкой следующих компонентов и функций:

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

Предыдущий пример предназначен для Razor Pages; версия для MVC похожа.

Каждый метод расширения Use добавляет один или несколько компонентов ПО промежуточного слоя в конвейер запросов. Например, UseStaticFiles настраивает ПО промежуточного слоя для обслуживания статических файлов.

Каждый компонент ПО промежуточного слоя в конвейере запросов отвечает за вызов следующего компонента в конвейере или замыкает цепочку, если это необходимо.

В сигнатуре метода IWebHostEnvironment могут быть указаны дополнительные службы, такие как ILoggerFactory, ConfigureServices или любые службы, определенные в Configure. Эти службы внедряются, если доступны.

Дополнительные сведения об использовании IApplicationBuilder и порядке обработки ПО промежуточного слоя см. в статье ПО промежуточного слоя ASP.NET Core.

Настройка служб без запуска

Для настройки служб и конвейера обработки запросов в построителе узлов вместо класса Startup можно использовать удобные методы ConfigureServices и Configure. Несколько вызовов ConfigureServices добавляются друг к другу. При наличии нескольких вызовов метода Configure используется последний вызов Configure.

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"];
                });
            });
        });
}

Расширение конфигурации запуска с использованием фильтров запуска

Используйте IStartupFilter в следующих случаях:

  • Для настройки промежуточного ПО в начале или конце конвейера приложения Configure без явного вызова Use{Middleware}. ASP.NET Core использует IStartupFilter для добавления значений по умолчанию в начало конвейера, исключая необходимость явной регистрации ПО промежуточного слоя по умолчанию автором приложения. IStartupFilter разрешает другим компонентам вызывать Use{Middleware} от имени автора приложения.
  • Для создания конвейера методов Configure. IStartupFilter.Configure может запускать промежуточное ПО до или после middleware, добавляемого библиотеками.

IStartupFilter реализует метод Configure, который принимает и возвращает Action<IApplicationBuilder>. IApplicationBuilder определяет класс для настройки конвейера запросов приложения. Дополнительные сведения см. в разделе Создание конвейера ПО промежуточного слоя с помощью IApplicationBuilder.

Каждый интерфейс IStartupFilter может добавлять один или несколько компонентов ПО промежуточного слоя в конвейер запросов. Фильтры вызываются в том порядке, в котором они были добавлены в контейнер службы. Фильтры могут добавлять ПО промежуточного слоя до или после передачи управления следующему фильтру, поэтому они добавляются в начало или конец конвейера приложения.

В следующем примере показана регистрация ПО промежуточного слоя с помощью IStartupFilter. ПО промежуточного слоя RequestSetOptionsMiddleware задает значения параметров из параметра строки запроса:

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

RequestSetOptionsMiddleware настраивается в классе RequestSetOptionsStartupFilter:

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

IStartupFilter регистрируется в контейнере службы в 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>();
        });
}

Если указан параметр строки запроса для option, ПО промежуточного слоя обрабатывает присвоение значения до того, как ПО промежуточного слоя ASP.NET Core отображает ответ.

Порядок выполнения ПО промежуточного слоя определяется порядком регистраций IStartupFilter:

  • Несколько реализаций IStartupFilter могут взаимодействовать с одними и теми же объектами. Если важен порядок, упорядочите регистрации сервисов IStartupFilter согласно порядку работы их промежуточного ПО.

  • Библиотеки могут добавлять ПО промежуточного слоя с одной или несколькими реализациями IStartupFilter, которые выполняются до или после другого ПО промежуточного слоя приложения, зарегистрированного с помощью IStartupFilter. Чтобы вызвать промежуточное ПО IStartupFilter перед промежуточным ПО, добавляемым библиотекой IStartupFilter, сделайте следующее:

    • Сначала выполните регистрацию службы перед добавлением библиотеки в контейнер служб.
    • Чтобы вызвать позже, расположите регистрацию службы после добавления библиотеки.

Добавление конфигурации из внешней сборки при запуске

Реализация IHostingStartup позволяет при запуске добавлять в приложение улучшения из внешней сборки вне приложения класса Startup. Дополнительную информацию см. в статье Использование начальных сборок для размещения в ASP.NET Core.

Дополнительные ресурсы