Что из себя представляет класс Startup и Program.cs в ASP.NET Core
В преддверии старта курса «C# ASP.NET Core разработчик» подготовили традиционный перевод полезного материала.
Также приглашаем на открытый вебинар по теме «Отличия структурных шаблонов проектирования на примерах». На вебинаре участники вместе с экспертом рассмотрят три структурных шаблона проектирования: Заместитель, Адаптер и Декоратор; а также напишут несколько простых программ и проведут их рефакторинг.
Введение
Program.cs — это место, с которого начинается приложение. Файл Program.cs в ASP.NET Core работает так же, как файл Program.cs в традиционном консольном приложении .NET Framework. Файл Program.cs является точкой входа в приложение и отвечает за регистрацию и заполнение Startup.cs, IISIntegration и создания хоста с помощью инстанса IWebHostBuilder, метода Main
.
Global.asax больше не входит в состав приложения ASP.NET Core. В ASP.NET Core заменой файла Global.asax является файл Startup.cs.
Файл Startup.cs — это также точка входа, и он будет вызываться после выполнения файла Program.cs на уровне приложения. Он обрабатывает конвейер запросов. Класс Startup запускается в момент запуска приложения.
Описание
Что такое Program.cs?
Program.cs — это место, с которого начинается приложение. Файл класса Program.cs является точкой входа в наше приложение и создает инстанс IWebHost, на котором размещается веб-приложение.
public class Program {
public static void Main(string[] args) {
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args).UseStartup < startup > ().Build();
}
WebHost используется для создания инстансов IWebHost, IWebHostBuilder и IWebHostBuilder, которые имеют предварительно настроенные параметры. Метод CreateDefaultBuilder()
создает новый инстанс WebHostBuilder.
Метод UseStartup()
определяет класс Startup
, который будет использоваться веб-хостом. Мы также можем указать наш собственный пользовательский класс вместо Startup.
Метод Build()
возвращает экземпляр IWebHost, а Run()
запускает веб-приложение до его полной остановки.
Program.cs в ASP.NET Core упрощает настройку веб-хоста.
public static IWebHostBuilder CreateDefaultBuilder(string[] args) {
var builder = new WebHostBuilder().UseKestrel().UseContentRoot(Directory.GetCurrentDirectory()).ConfigureAppConfiguration((hostingContext, config) => {
/* setup config */ }).ConfigureLogging((hostingContext, logging) => {
/* setup logging */ }).UseIISIntegration()
return builder;
}
Метод UseKestrel()
является расширением, которое определяет Kestrel как внутренний веб-сервер. Kestrel — это кроссплатформенный веб-сервер для ASP.NET Core с открытым исходным кодом. Приложение работает с модулем Asp.Net Core, и необходимо включить интеграцию IIS (UseIISIntegration()
), которая настраивает базовый адрес и порт приложения.
Он также настраивает UseIISIntegration()
, UseContentRoot()
, UseEnvironment(Development)
, UseStartup()
и другие доступные конфигурации, например Appsetting.json и Environment Variable. UseContentRoot
используется для обозначения текущего пути к каталогу.
Мы также можем зарегистрировать логирование и установить минимальный loglevel, как показано ниже. Это также переопределит loglevel, настроенный в файле appsetting.json.
.ConfigureLogging(logging =>
{ logging.SetMinimumLevel(LogLevel.Warning); })
Таким же образом мы можем контролировать размер тела нашего запроса и ответа, включив эту опцию файле program.cs, как показано ниже.
.ConfigureKestrel((context, options) =>
{ options.Limits.MaxRequestBodySize = 20000000; });
ASP.net Core является кроссплатформенным и имеет открытый исходный код, а также его можно размещать на любом сервере (а не только на IIS, внешнем веб-сервере), таком как IIS, Apache, Nginx и т. д.
Что такое файл Startup?
Обязателен ли файл startup.cs или нет? Да, startup.cs является обязательным, его можно специализировать любым модификатором доступа, например, public, private, internal. В одном приложении допускается использование нескольких классов Startup. ASP.NET Core выберет соответствующий класс в зависимости от среды.
Если существует класс Startup{EnvironmentName}
, этот класс будет вызываться для этого EnvironmentName
или будет выполнен файл Startup для конкретной среды в целом (Environment Specific), чтобы избежать частых изменений кода/настроек/конфигурации в зависимости от среды.
ASP.NET Core поддерживает несколько переменных среды, таких как Development, Production и Staging. Он считывает переменную среды ASPNETCORE_ENVIRONMENT
при запуске приложения и сохраняет значение в интерфейсе среды хоста (into Hosting Environment interface).
Обязательно ли этот класс должен называться startup.cs
? Нет, имя класса не обязательно должно быть Startup.
Мы можем определить два метода в Startup файле, например ConfigureServices и Configure, вместе с конструктором.
Пример Startup файла
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) {
...
}
}
Метод ConfigureServices
Это опциональный метод в классе Startup, который используется для настройки сервисов для приложения. Когда в приложение поступает какой-либо запрос, сначала вызывается метод ConfigureService
.
Метод ConfigureServices
включает параметр IServiceCollection
для регистрации сервисов. Этот метод должен быть объявлен с модификатором доступа public, чтобы среда могла читать контент из метаданных.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}
Метод Configure
Метод Configure
используется для указания того, как приложение будет отвечать на каждый HTTP-запрос. Этот метод в основном используется для регистрации промежуточного программного обеспечения (middleware) в HTTP-конвейере. Этот метод принимает параметр IApplicationBuilder
вместе с некоторыми другими сервисами, такими как IHostingEnvironment
и ILoggerFactory
. Как только мы добавим какой-либо сервис в метод ConfigureService
, он будет доступен для использования в методе Configure
.
public void Configure(IApplicationBuilder app)
{
app.UseMvc();
}
В приведенном выше примере показано, как включить функцию MVC в нашем фреймворке. Нам нужно зарегистрировать UseMvc()
в Configure и сервис AddMvc()
в ConfigureServices
. UseMvc
является промежуточным программным обеспечением. Промежуточное программное обеспечение (Middleware) — это новая концепция, представленная в Asp.net Core. Для вас доступно множество встроенных промежуточных программ, некоторые из которых указаны ниже.
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
UseCookiePolicy();
UseSession();
Промежуточное программное обеспечение можно настроить в http-конвейере с помощью команд Use
, Run
и Map
.
Run
Суть Run заключается в немедленном замыкании HTTP-конвейера. Это лаконичный способ добавления промежуточного программного обеспечения в конвейер, который не вызывает никакого другого промежуточного программного обеспечения, которое находится рядом с ним, и немедленно возвращает HTTP-ответ.
Use
Это передаст следующему (параметр next) делегату, так что HTTP-запрос будет передан следующему промежуточному программному обеспечению после выполнения текущего, если следующий делегат есть.
Map
Map просто принимает путь и функцию, которая конфигурирует отдельный конвейер промежуточного программного обеспечения.
app.Map("/MyDelegate", MyDelegate);
Чтобы получить более подробную информацию о промежуточном программном обеспечении, переходите сюда
ASP.net Core имеет встроенную поддержку внедрения зависимостей (Dependency Injection
). Мы можем настроить сервисы для контейнера внедрения зависимостей, используя этот метод. Следующие способы — конфигурационные методы в Startup
классе.
AddTransient
Transient (временные) объекты всегда разные; каждому контроллеру и сервису предоставляется новый инстанс.
Scoped
Scoped — используются одни и те же объекты в пределах одного запроса, но разные в разных запросах.
Singleton
Singleton — объекты одни и те же для каждого объекта и каждого запроса.
Можем ли мы удалить startup.cs и объединить все в один класс с Program.cs?
Ответ: Да, мы можем объединить все классы запуска в один файл.
Заключение
Вы получили базовое понимание того, почему файлы program.cs и startup.cs важны для нашего приложения Asp.net Core и как их можно настроить. Мы также немного познакомились с переменной среды (Environment Variable), внедрение зависимостей, промежуточным программным обеспечением и как его настроить. Кроме того, мы увидели, как можно настроить UseIIsintegration()
и UseKestrel()
.
Узнать подробнее о курсе «C# ASP.NET Core разработчик»
Смотреть открытый вебинар по теме «Отличия структурных шаблонов проектирования на примерах».