zoukankan      html  css  js  c++  java
  • ASP.NET Core项目解读之常用概念方法

    环境:ASP.NET Core3.1

    ASP.NET Core是一个全新的Web开发平台,微软在它上面构建了MVC、SingalR、GRPC、Orleans这样广泛使用的Web框架,我们先以MVC框架为例介绍利用ASP.NET Core构建项目的常见名词。

    ASP.NET  Core MVC项目文件夹解读

    一、什么是泛型主机?

      主机是封装应用资源的对象,例如 :依赖关系注入 (DI)、Logging、Configuration、IHostedService 实现。启动主机时,它对它在 DI 容器中找到的 IHostedService 的每个实现调用 IHostedService.StartAsync。 在 web 应用中,其中一个 IHostedService 实现是启动 HTTP 服务器实现的 web 服务。一个对象中包含所有应用的相互依赖资源的主要原因是生存期管理:控制应用启动和正常关闭。

    二、泛型主机的创建、配置  

      1、主机通常由 Program 类中的代码配置、生成和运行,Program.cs是ASP.NET Core的启动入口文件。 Main 方法可以拆成以下代码:

    IHostBuilder hostBuilder = CreateHostBuilder(args);//产生一个IHostBuilder实例hostBuilder ,创建通用主机
    IHost host= hostBuilder.Build(); //运行给定操作以初始化主机。 这只能调用一次
    host.Run();//运行应用程序并阻止调用线程,直至主机关闭。

       

      2、CreateHostBuilder在创建泛型主机的时候进行了什么样的配置呢?

      (1)CreateDefaultBuilder 方法的默认做的操作如下:

      •   将内容根目录设置为由 GetCurrentDirectory 返回的路径
      •   通过以下项加载主机配置:
        • 前缀为 DOTNET_ 的环境变量
        • 命令行参数
      •   通过以下对象加载应用配置:
        • appsettings.json
        • appsettings.{Environment}.json
        • 密钥管理器 当应用在 Development 环境中运行时
        • 环境变量。
        • 命令行参数。
      •   添加以下日志记录提供程序:
        • 控制台
        • 调试
        • EventSource
        • EventLog(仅当在 Windows 上运行时)
      •   当环境为“开发”时,启用范围验证依赖关系验证

      (2)ConfigureWebHostDefaults 方法的默认做的操作如下:  

      •   从前缀为 ASPNETCORE_ 的环境变量加载主机配置。
      •   使用应用的托管配置提供程序将 Kestrel 服务器设置为 web 服务器并对其进行配置。 有关 Kestrel 服务器默认选项,请参阅 ASP.NET Core 中的 Kestrel Web 服务器实现
      •   添加主机筛选中间件默认情况下,主机筛选中间件处于禁用状态。 要启用该中间件,请在 appsettings.json/appsettings.<EnvironmentName>.json 中定义一个 AllowedHosts 键 。 此值是以分号分隔的不带端口号的主机名列表。
      •   如果 ASPNETCORE_FORWARDEDHEADERS_ENABLED 等于 true,则添加转接头中间件
      •   支持 IIS 集成。 有关 IIS 默认选项,请参阅 使用 IIS 在 Windows 上托管 ASP.NET Core

    二、Program.cs概要

      ASP.NET Core应用程序需要在主机中执行,一个主机必须实现 IHost接口。主机通常使用 HostBuilder的实例来创建,该实例构建并返回一个 Host实例。 Host引用一个将用于处理请求的服务器Kestrel。主机负责应用程序启动和生命周期的管理。服务器Kestrel负责接受HTTP请求。主机的部分职责还包括确保应用程序服务和服务器Kestrel可用并正确配置。

        public static void Main(string[] args)
            {
                IHostBuilder hostBuilder = CreateHostBuilder(args);
                IHost host = hostBuilder.Build();//创建主机
                host.Run();
                //CreateHostBuilder(args).Build().Run();
            }
    
            public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    });

    三、IHostBuilder

       HostBuilder 用来构建 Host ,也是我们最先接触的一个类,它提供了如下方法:

      1、ConfigureAppConfiguration  

        通过对 IHostBuilder 调用 ConfigureAppConfiguration 为生成过程和应用程序的其余部分设置配置, 可多次进行调用,并累加结果 。由 ConfigureAppConfiguration 创建的配置可以通过 HostBuilderContext.Configuration 获取以用于后续操作,也可以通过 DI 作为服务获取, 主机配置也会添加到应用配置。 

        public static void Main(string[] args)
            {
                CreateHostBuilder(args).Build().Run();
            }
    
            public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    }).ConfigureAppConfiguration((h, c) =>//指定应用的配置提供程序
                    {
                        c.AddJsonFile($"PersonConfig.Development.json", true, true);
                    });

       2、ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate)

       该方法是用来注入服务,我们关注点是参数HostBuilderContext,包含 IHost 上的公共服务的上下文。我们可以通过该参数获取应用程序中的配置信息等。

      比如我们的配置信息是在appsettings.json中。

    四、Startup.cs

      ConfigureServices 用于配置依赖注入以在运行时根据依赖关系创建对象,Configure 用于配置中间件(middleware)以构建请求处理流水线。

      1、Configure

      在ASP.NET Core 应用程序中Configure方法用于指定中间件以什么样的形式响应HTTP请求。 Configure 方法是用来配置请求管道的,通常会在这里会注册一些中间件

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            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.UseStaticFiles(new StaticFileOptions
                {
                    FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "ProjectStaticFile")),
                    RequestPath = "/StaticFiles"
                });
    
                app.UseRouting();
    
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllerRoute(
                        name: "default",
                        pattern: "{controller=Home}/{action=Index}/{id?}");
                });
            }

      

      2、ConfigureServices

      ConfigureServices方法是应用程序运行时将服务添加到容器中

        // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddControllersWithViews();//将控制器的服务添加到指定的IServiceCollection此方法将不会注册用于页面的服务。
           // IOPtions 方式读取自定义的配置,可参考之前梳理的知识 PersonOptions option
    = new PersonOptions(); Configuration.GetSection("PersonOptions").Bind(option); services.AddSingleton(option); }

    五、处理管道(中间件)   

      1、中间件是一种装配到应用管道以处理请求和响应的软件。

         2、管道就是多个中间件构成,当接收到一个请求时,请求会交给管道进行处理,请求从一个中间件的一端进入,从中间件的另一端出来,每个中间件都可以对HttpContext请求开始和结束进行处理。

      3、请求管道中的每个中间件负责调用管道中的下一个中间件,或使管道短路。 当中间件短路时,它被称为“终端中间件” ,因为它阻止中间件进一步处理请求。  

      4、ASP.NET Core 请求管道包含一系列请求委托,依次调用。 下图演示了这一概念。 沿黑色箭头执行。

     

      (1)每个委托均可在下一个委托前后执行操作。 应尽早在管道中调用异常处理委托,这样它们就能捕获在管道的后期阶段发生的异常。

      (2)ASP.NET Core 应用设置了处理所有请求的单个请求委托。 这种情况不包括实际请求管道, 调用单个匿名函数以响应每个 HTTP 请求。

      5、以下 Startup.Configure 方法将为常见应用方案添加中间件组件:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }
    
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        // app.UseCookiePolicy();
    
        app.UseRouting();
        // app.UseRequestLocalization();
        // app.UseCors();
    
        app.UseAuthentication();
        app.UseAuthorization();
        // app.UseSession();
    
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }
      • 异常/错误处理
        • 当应用在开发环境中运行时:
          • 开发人员异常页中间件 (UseDeveloperExceptionPage) 报告应用运行时错误。
          • 数据库错误页中间件报告数据库运行时错误。
        • 当应用在生产环境中运行时:
          • 异常处理程序中间件 (UseExceptionHandler) 捕获以下中间件中引发的异常。
          • HTTP 严格传输安全协议 (HSTS) 中间件 (UseHsts) 添加 Strict-Transport-Security 标头。
      • HTTPS 重定向中间件 (UseHttpsRedirection) 将 HTTP 请求重定向到 HTTPS。
      • 静态文件中间件 (UseStaticFiles) 返回静态文件,并简化进一步请求处理。
      • Cookie 策略中间件 (UseCookiePolicy) 使应用符合欧盟一般数据保护条例 (GDPR) 规定。
      • 用于路由请求的路由中间件 (UseRouting)。
      • 身份验证中间件 (UseAuthentication) 尝试对用户进行身份验证,然后才会允许用户访问安全资源。
      • 用于授权用户访问安全资源的授权中间件 (UseAuthorization)。
      • 会话中间件 (UseSession) 建立和维护会话状态。 如果应用使用会话状态,请在 Cookie 策略中间件之后和 MVC 中间件之前调用会话中间件。
      • 用于将 Razor Pages 终结点添加到请求管道的终结点路由中间件(带有 MapRazorPages 的 UseEndpoints)。
  • 相关阅读:
    《数据结构第一章复习》
    《图的基本操作》
    《矩阵的一些基本操作》
    <矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置>
    《两个二维数组(矩阵)相乘》
    C#隐藏与显示系统任务栏和开始菜单栏按钮
    C#通过窗体属性缩小一定尺寸时,无法再缩小窗体尺寸问题
    C#一个窗体调用另一个窗体的方法
    C#异步线程
    C#中MessageBox.Show问题(让提示窗口不显示在任务栏中)
  • 原文地址:https://www.cnblogs.com/qtiger/p/12976207.html
Copyright © 2011-2022 走看看