标签:core nameof MiddleWare await 中间件 next context logger public
直接通过反射 找到类
RequestDelegate 和 InvokeAsync 这2个都是固定写法 框架帮我们写死的 ,
如果看是不是中间件,框架先检查 参数 有没有InvokeAsync方法和第一个参数必须是RequestDelegate
源码如下 :
app.UseMiddleware<OnetMiddleWare>();
public class OneMiddleWare { private readonly RequestDelegate _next; public OneMiddleWare(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { await context.Response.WriteAsync($"{nameof(OneMiddleWare)},Hello World1!<br/>"); await _next(context); await context.Response.WriteAsync($"{nameof(OneMiddleWare)},Hello World2!<br/>"); } }
app.UseMiddleware<TwoMiddleWare>(); 是实现 IMiddleware 接口 TwoMiddleWare类型的初始化是请求来了之后才发生, 实现IMiddleware,就不能有参数--而且还得IOC注册
public class TwoMiddleWare : IMiddleware, IDisposable { private readonly ILogger _logger; public TwoMiddleWare(ILogger<TwoMiddleWare> logger) { this._logger = logger; } public async Task InvokeAsync(HttpContext context, RequestDelegate next) { this._logger.LogWarning($"{nameof(TwoMiddleWare)},Hello World1!<br/>"); await context.Response.WriteAsync($"{nameof(TwoMiddleWare)},Hello World1!<br/>"); await next(context); await context.Response.WriteAsync($"{nameof(TwoMiddleWare)},Hello World2!<br/>"); } public void Dispose() { Console.WriteLine("释放需要释放的资源"); } }
app.UseMiddleware<ThreeMiddleWare>("tet"); 可以带参数 前面第一个参数 和第三个参数不是ioc 注入的 是传入的
,而第二个参数是ioc 生成的。我们没有service 里面 添加ThreeMiddleWare 的注册
public class ThreeMiddleWare { private readonly RequestDelegate _next; private readonly ILogger _logger; private readonly string _Message; public ThreeMiddleWare(RequestDelegate next, ILogger<ThreeMiddleWare> logger, string message) { this._next = next; this._logger = logger; this._Message = message; } /// <summary> /// 1 方法名字Invoke或者InvokeAsync /// 2 返回类型必须是Task /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task Invoke(HttpContext context) { Console.WriteLine($"{nameof(ThreeMiddleWare)}---{this._Message}"); if (!context.Request.Path.Value.Contains("Eleven")) { await context.Response.WriteAsync($"{nameof(ThreeMiddleWare)}This is End<br/>"); } else { await context.Response.WriteAsync($"{nameof(ThreeMiddleWare)},Hello World ThreeMiddleWare!<br/>"); await _next(context); await context.Response.WriteAsync($"{nameof(ThreeMiddleWare)},Hello World ThreeMiddleWare!<br/>"); } } }
在bulid 的时候 才执行里面的 委托方法 。
标签:core,nameof,MiddleWare,await,中间件,next,context,logger,public 来源: https://www.cnblogs.com/jasontarry/p/15376267.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。