Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Note
Это не последняя версия этой статьи. В текущей версии см. версию .NET 10 этой статьи.
Warning
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущей версии см. версию .NET 10 этой статьи.
Автор: Рик Андерсон (Rick Anderson)
ASP.NET Core приложения, созданные с помощью веб-шаблонов, содержат код запуска приложения в файле Program.cs.
Руководство по запуску
Следующий код запуска приложения поддерживает несколько типов приложений:
- Blazor Web Apps
- Razor страницы
- контроллеры MVC с представлениями;
- веб-API с контроллерами;
- Минимальные API
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 настраивают конвейер с поддержкой следующих компонентов и функций:
- Страница со сведениями об исключении для разработчика
- Обработчик исключений
- Строгое обеспечение безопасности транспорта HTTP (HSTS)
- Перенаправление HTTPS
- Статические файлы
- ASP.NET Core MVC и Razor Pages
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.
Дополнительные ресурсы
ASP.NET Core