博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
asp.net core 系列之中间件进阶篇-编写自定义中间件(middleware)
阅读量:4953 次
发布时间:2019-06-12

本文共 3094 字,大约阅读时间需要 10 分钟。

 

中间件是被用到管道(pipeline)上来处理请求(request)和响应的(response)。

asp.net core 本身提供了一些内置的中间件,但是有一些场景,你可能会需要写一些自定义的中间件。

 

1. 创建一个使用匿名委托的中间件组件的形式

public class Startup{    public void Configure(IApplicationBuilder app)    {        app.Use((context, next) =>        {            var cultureQuery = context.Request.Query["culture"];            if (!string.IsNullOrWhiteSpace(cultureQuery))            {                var culture = new CultureInfo(cultureQuery);                CultureInfo.CurrentCulture = culture;                CultureInfo.CurrentUICulture = culture;            }            // Call the next delegate/middleware in the pipeline            return next();        });        app.Run(async (context) =>        {            await context.Response.WriteAsync(                $"Hello {CultureInfo.CurrentCulture.DisplayName}");        });    }}

 注:app.use中return next()会传递到下一个中间件继续执行;而仅仅只使用app.use 的用法和app.run相同,即不会再传递到下一个中间件,在此作为请求处理的结束

2.把中间件的委托封装到类里面,即把中间件写成一个类的形式

using Microsoft.AspNetCore.Http;using System.Globalization;using System.Threading.Tasks;namespace Culture{    public class RequestCultureMiddleware    {        private readonly RequestDelegate _next;        public RequestCultureMiddleware(RequestDelegate next)        {            _next = next;        }        public async Task InvokeAsync(HttpContext context)        {            var cultureQuery = context.Request.Query["culture"];            if (!string.IsNullOrWhiteSpace(cultureQuery))            {                var culture = new CultureInfo(cultureQuery);                CultureInfo.CurrentCulture = culture;                CultureInfo.CurrentUICulture = culture;            }            // Call the next delegate/middleware in the pipeline            await _next(context);        }    }}

 

然后,再使用一个中间件扩展方法,通过IApplicationBuilder使用中间件

using Microsoft.AspNetCore.Builder;namespace Culture{    public static class RequestCultureMiddlewareExtensions    {        public static IApplicationBuilder UseRequestCulture(            this IApplicationBuilder builder)        {            return builder.UseMiddleware
(); } }}

 

最后,在 Startup.Configure 中调用中间件

public class Startup{    public void Configure(IApplicationBuilder app)    {        app.UseRequestCulture();  //调用中间件        app.Run(async (context) =>        {            await context.Response.WriteAsync(                $"Hello {CultureInfo.CurrentCulture.DisplayName}");        });    }}

 

另外,这里还有一点,这个地方不是很懂,说下自己的理解,欢迎大佬指正

当中间件中注入的还有其他service(官方叫 a scoped service )时,需要使用的是Invoke方法,而不是InvokeAsync方法

public class CustomMiddleware{    private readonly RequestDelegate _next;    public CustomMiddleware(RequestDelegate next)    {        _next = next;    }    // IMyScopedService is injected into Invoke    public async Task Invoke(HttpContext httpContext, IMyScopedService svc)    {        svc.MyProperty = 1000;        await _next(httpContext);    }}

这里,Invoke和InvokeAsync是不是相同,还是说就仅仅是命名不同,其他用法都一样?

欢迎指正

 

参考网址:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/write?view=aspnetcore-2.2

 

转载于:https://www.cnblogs.com/Vincent-yuan/p/10771721.html

你可能感兴趣的文章
使用axel下载百度云文件
查看>>
Qt中图像的显示与基本操作
查看>>
详解软件工程之软件测试
查看>>
WCF(二) 使用配置文件实现WCF应用程序
查看>>
【CodeForces 803 C】Maximal GCD(GCD+思维)
查看>>
python 去掉换行符或者改为其他方式结尾的方法(end='')
查看>>
数据模型(LP32 ILP32 LP64 LLP64 ILP64 )
查看>>
java小技巧
查看>>
POJ 3204 Ikki's Story I - Road Reconstruction
查看>>
【BZOJ】2959: 长跑(lct+缩点)(暂时弃坑)
查看>>
iOS 加载图片选择imageNamed 方法还是 imageWithContentsOfFile?
查看>>
LUOGU P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…
查看>>
toad for oracle中文显示乱码
查看>>
SQL中Group By的使用
查看>>
错误org/aopalliance/intercept/MethodInterceptor解决方法
查看>>
Pylint在项目中的使用
查看>>
使用nginx做反向代理和负载均衡效果图
查看>>
access remote libvirtd
查看>>
(4) Orchard 开发之 Page 的信息存在哪?
查看>>
ASP.NET中 GridView(网格视图)的使用前台绑定
查看>>