接上上篇学习笔记


中间件(MiddleWare)

两个职责:

  1. 选择是否将请求传递给下一个管道中的下一个中间件
  2. 在管道中的下一个中间件的前后执行工作

每一个中间件都有权做出决定是否将请求传递给下一中间件,也可以直接作出响应,促使管道短路。

短路:指不再将请求继续传递下去,而是结束请求并开始响应。短路是非常有必要的,避免很多不必要的工作。

如何布置管道,在管道中布置中间件
//中间件初体验
            //Use有next委托,可以直接短路响应或者继续传递
            app.Use(async (context, next) =>
            {
                await context.Response.WriteAsync("Hello Use Start! \r\n");
                await next();
                await context.Response.WriteAsync("Hello Use End! \r\n");
            });

            //Run没有next委托,不能传递,一般用于终端中间件
            //终端中间件:专门用来短路请求管道,是放在管道最后面,兜底的
            app.Run(async context =>
            {
                await context.Response.WriteAsync("Hello Run! \r\n");
            });

中间件是有顺序的:添加中间件的顺序就是请求调用中间件的顺序。

顺序的重要性:身份认证中间件放在最前面(但不能放在路由前面)

自定义中间件

约定

  1. 具有类型为requestDelegate的参数的公共构造函数
  2. 具有名为invoke或者invokeAsync且第一个参数为HttpContext、返回值为Task的方法

多环境配置

三种内置环境
  1. 预览环境:env.IsStaging()
  2. 开发环境:env.IsDeveloment()
  3. 生产环境:env.IsProduction()
多环境配置
  1. 方法多环境

    1. public void ConfigureDemoServices() { }
    2. public void ConfigureDemo() { }
  2. 类多环境

public classStartupDemo() { } => webBuilder.UseStartup(Assembly.GetExecutingAssembly().FullName)

Tips:程序会根据“约定”的格式规范,提取出自定义环境名称并进行判断加载,如果没有找到目标方法或类则会加载默认的方法和类。

其它环境判断

env.IsEnvironment("Demo")

日志配置

在ASP.NET Core中,所有的日志配置使用方法都大同小异(实现了一个日志提供程序,调用都是统一的)

ASP.NET Core内置日志组件

支持输出到控制台、对话框、系统的事件中

不支持输出到文件、数据库!!!

所以涉及到第三方日志组件:NLog、Log4Net

ASP.NET Core日志级别

6种[0-5],Trace < Debug < Infomation < Warring < Error < Critical

设置级别:webBuilder.ConfigureLogging(builder => builder.SetMinimumLevel(LogLevel.Critical))

添加日志输出

webBuilder.ConfigureLogging(builder => builder.AddConsole().AddDebug().AddEventLog())

Tips:使用第三方组件NLog时,需要添加到webBuilder的末尾

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.ConfigureLogging(builder => builder.SetMinimumLevel(LogLevel.Critical));
                    webBuilder.ConfigureLogging(builder => builder.AddConsole().AddDebug().AddEventLog());

                    webBuilder.UseStartup<Startup>();
                }).UseNLog();
NLog使用

创建配置文件:nlog.config 文件名固定+xml格式,配置内容可以到官网copy

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <variable name="logDirectory" value="E:/Log"/>

  <!--<targets>
    <default-wrapper xsi:type="AsyncWrapper"></default-wrapper>
    <target xsi:type="File"
            name="file-api-log"
            fileName="${logDirectory}/api_logs/${shortdate}.txt"
            layout ="${longdate} ${message}"/>
    <target xsi:type="File"
           name="file-api-log-error"
           fileName="${logDirectory}/api_logs_error/${shortdate}.txt"
           layout ="${longdate} ${message}"/>
  </targets>-->
  <-- 按照小时记录  -->
  <targets>
    <default-wrapper xsi:type="AsyncWrapper"></default-wrapper>
    <target xsi:type="File"
            name="file-api-log"
            fileName="${basedir}/api_logs/${date:format=yyyy-MM-dd-HH}.txt"
            layout ="${longdate} ${message}"/>
    <target xsi:type="File"
           name="file-api-log-error"
           fileName="${basedir}/api_logs_error/${date:format=yyyy-MM-dd-HH}.txt"
           layout ="${longdate} ${message}"/>
  </targets>

  <rules>
    <logger name="api-log" minlevel="Info" writeTo="file-api-log"></logger>
    <logger name="api-log-error" minlevel="Error" writeTo="file-api-log-error"></logger>
  </rules>
</nlog>

通过依赖注入的方式引用Nlog

public void Configure(IApplicationBuilder app, ILogger<Startup> logger)
        {

            logger.LogInformation(null,null,null,null);

        }

路由配置

ASP.NET Core 3.x中,app.UseRouting()和app.UseEndpoinits()成对出现,ASP.NET Core 2.x中没有这个

app.UseRouting()作用

负责匹配路由与终结点(端点)的,解析出路由信息并写进httpContext,传给下一个中间件(app.UseRouting()和app.UseEndpoinits()之间的其他中间件);

端点就是一个终端中间件(末尾的),不止一个,每个action都可以是端点

app.UseEndpoinits()作用

负责执行、负责配置

声明:文中涉及的观点仅为个人在学习时总结以及讲师的原话,如有冒犯请海涵

Last modification:March 18th, 2020 at 04:29 pm
如果觉得我的文章对你有用,请随意赞赏