ASP.NET Core 基础(一)——Startup

Startup类

作用:用来配置服务和请求管道。
服务是一种提供应用功能的可重用组件,在ConfigureServices中注册服务,然后通过DI或applicationServices.GetRequriedService<T>()在整个应用中使用服务。

Program.cs中构建主机(IHost)时指定了Startup类webBuilder.UseStartup<Startup>();

框架会自动注册一些服务(具体有哪些见后续依赖注入章节),以下服务由框架自动注册所以可以直接注入到Startup的构造函数:

  • IWebHostEnvironment/IHostEvironment:获取ApplicationName、EnvironmentName、ContentRootPath等。
  • IHostLifeTime:用来控制主机何时启动和停止
  • IHostApplicationLifeTime:与IHostedService配合使用,可以在主机启动前、停止时、停止后做一些事情。
  • IConfiguration

Startup构造函数注入虽然只支持以上几种,但是你可以将任何已经向DI容器注册的服务注入到Startup的Configure方法里。

1.CongfigureService方法

作用:将各种各样的服务添加到服务容器

  • 非必须,不一定要有这个方法
  • 在主机(Host)调用Configure方法之前,优先会调用这个方法
  • 一些常规的配置项(见配置章节

2.Configure方法

作用:指定应用响应HTTP请求的方式,配置请求管道。方法的入参IApplicationBuilder并不是IHost注入的,而是托管创建的并直接传入。

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }

模板默认的管道有以下:

  • 开发人员异常页app.UseDeveloperExceptionPage()(详见处理错误章节)
  • 异常处理程序app.UseExceptionHandler("/Error");(详见处理错误章节)
  • HTTP严格传输安全性(HSTS)app.UseHsts()(详见安全和标识)
  • HTTPS重定向app.UseHttpsRedirection();(详见安全和标识)
  • 静态文件app.UseStaticFiles();
  • MVC和Razor Pages中间件

3.如果没有Startup文件该怎么配置服务?

Program.csCreateHostBuilder方法中配置:

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

4.Startup过滤器:IStartupFilter

作用:其实是一个Configure方法的管道(这也是为什么要在ConfigureServices方法里配置的原因),而不是Configure方法内各个中间件的管道。这个管道内有好多Configure方法。

使用场景:

  • 你自己创建了一个库,你需要确保你的中间件在所有的中间件的开头或结尾运行
  • 你正在使用一个IStartupFilter的库,你需要确保你的中间件在所有的中间件之前运行。
  • 验证强类型配置
  • 进行数据迁移和缓存预读取

参考:https://blog.csdn.net/qq_22949043/article/details/86516221

默认情况下,appsettings.jsonappsettings.{Environment}.json文件会在更改后重新加载。如果不想被重新加载则在json中增加:hostBuilder:reloadConfigOnChange节点。

5.多Startup:

如果同时存在多个,如Startup.cs、StartupDevelopment,.cs。如果当前环境是Development则会优先使用StartupDevelopment.cs。使用时通过assembly扫描:

.ConfigureWebHostDefaults(webBuilder =>
{
   webBuilder.UseStartup(typeof(Startup).GetTypeInfo().Assembly.FullName);
});

同样startup的configureconfigureservices方法也支持{Environment},即Configure{EnvironmentName}Configure{EnvironmentName}Services。如:ConfigureDevelopmentServices、ConfigureStagingServices。

参考:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/environments?view=aspnetcore-5.0#environment-based-startup-class-and-methods

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JimCarter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值