接上上篇学习笔记
中间件(MiddleWare)
两个职责:
- 选择是否将请求传递给下一个管道中的下一个中间件
- 在管道中的下一个中间件的前后执行工作
每一个中间件都有权做出决定是否将请求传递给下一中间件,也可以直接作出响应,促使管道短路。
短路:指不再将请求继续传递下去,而是结束请求并开始响应。短路是非常有必要的,避免很多不必要的工作。
如何布置管道,在管道中布置中间件
//中间件初体验
//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");
});
中间件是有顺序的:添加中间件的顺序就是请求调用中间件的顺序。
顺序的重要性:身份认证中间件放在最前面(但不能放在路由前面)
自定义中间件
约定
- 具有类型为requestDelegate的参数的公共构造函数
- 具有名为invoke或者invokeAsync且第一个参数为HttpContext、返回值为Task的方法
多环境配置
三种内置环境
- 预览环境:env.IsStaging()
- 开发环境:env.IsDeveloment()
- 生产环境:env.IsProduction()
多环境配置
方法多环境
- public void ConfigureDemoServices() { }
- public void ConfigureDemo() { }
- 类多环境
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()作用
负责执行、负责配置
声明:文中涉及的观点仅为个人在学习时总结以及讲师的原话,如有冒犯请海涵