ASP.NET Core中间件如何使用及官方常用中间件具体有哪些应用场景?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1786个文字,预计阅读时间需要8分钟。
目录
一、什么是中间件
二、中间件和过滤器的区别
三、中间件常用方法
1.Run方法
2.Use方法
3.Map方法
4.Mapwhen方法
四、自定义中间件
五、官方常用中间件
1.异常处理中间件
2.HTTPS重定向
目录
- 一、什么是中间件
- 中间件和过滤器的区别
- 二、中间件常用方法
- 1、Run方法
- 2、Use方法
- 3、Map方法
- 4、Mapwhen方法
- 三、自定义中间件
- 四、官方常用中间件
- 1、异常处理中间件
- 2、HTTPS重定向中间件
- 3、静态文件中间件
- 4、Cookie中间件
- 5、路由中间件
- 6、身份认证中间件
- 7、授权中间件
- 8、会话中间件
- 9、终结点路由中间件
一、什么是中间件
我们都知道,任何的一个web框架都是把localhost:5000/Map1 app.Map(pathMatch: "/Map1", configuration: HandleMap1); // 匹配的URL:localhost:5000/Map2 app.Map(pathMatch: "/Map2", configuration: HandleMap2);
运行程序,然后在浏览器地址栏里面输入:localhost:5000/Map1,输出结果:
在地址栏里面在输入:localhost:5000/Map2,输出结果:
Map还支持嵌套,看下面的代码:
// 嵌套Map app.Map(pathMatch: "/Map1", configuration: App1 => { // App1.Map("/Map2",action=> { action.Run(async context => { await context.Response.WriteAsync("This is /Map1/Map2"); }); }); App1.Run(async context => { await context.Response.WriteAsync("This is no-map"); }); });
访问localhost:5000/Map1/123输出结果:
访问localhost:5000/Map1输出结果:
访问localhost:5000/Map1/Map2输出结果:
Map也可以同时匹配多个段,看下面的代码:
运行程序,输出结果:
访问localhost:5000/Map1/Map2输出结果:
4、Mapwhen方法
MapWhen是基于给定的谓词分支请求管道。任何使Func<HttpContext,bool>返回true的谓词的请求都被映射到新的管道分支。
我们先来看看Mapwhen方法的定义:
可以看出:MapWhen方法有两个参数:第一个参数是Func类型的委托,输入参数是HttpContext,输出参数是bool类型。第二个参数是Action委托,参数是IApplicationBuilder类型,表示也可以把实现Action委托的方法添加到中间件管道中执行。
看下面的例子,如果url中包括name查询参数,则执行HandleName方法,如果包含age查询参数,则执行HandleAge方法,否则执行Run()方法。
HandleName和HandleAge方法定义如下:
private void HandleName(IApplicationBuilder app) { app.Run(handler: async context => { await context.Response.WriteAsync(text: $"This name is: {context.Request.Query["name"]}"); }); } private void HandleAge(IApplicationBuilder app) { app.Run(handler: async context => { await context.Response.WriteAsync(text: $"This age is: {context.Request.Query["age"]}"); }); }
对应的MapWhen方法定义如下:
// 如果访问的url参数中包含name,则执行HandleName app.MapWhen( // Func委托,输入参数是HttpContext,返回bool值 predicate: context => { // 判断url参数中是否包含name return context.Request.Query.ContainsKey("name"); }, configuration: HandleName); // 如果访问的url参数中包含name,则执行HandleAge app.MapWhen( // Func委托,输入参数是HttpContext,返回bool值 predicate: context => { // 判断url参数中是否包含age return context.Request.Query.ContainsKey("age"); }, configuration: HandleAge); app.Run(async context => { await context.Response.WriteAsync("There is non-Map delegate \r\n"); });
运行程序,输出结果:
在url里面添加name查询参数输出结果:
在url里面添加age查询参数输出结果:
三、自定义中间件
在上面的例子中,我们都是使用的官方中间件自动的方法,其实我们也可以自己编写一个中间件。
中间件遵循显示依赖原则,并在其构造函数中暴露所有依赖项。中间件能够利用UseMiddleware<T>扩展方法的优势,直接通过它们的构造函数注入服务。依赖注入服务是自动完成填充的。
ASP.NET Core约定中间件类必须包括以下内容:
- 具有类型为RequestDelegate参数的公共构造函数。
- 必须有名为Invoke或InvokeAsync的公共方法,此方法必须满足两个条件:方法返回类型是Task、方法的第一个参数必须是HttpContext类型。
我们自定义一个记录IP的中间件,新建一个类RequestIPMiddleware,代码如下:
using Microsoft.AspNetCore.Http; using System.Threading.Tasks; namespace MiddlewareDemo.Middleware { /// <summary> /// 记录IP地址的中间件 /// </summary> public class RequestIPMiddleware { // 私有字段 private readonly RequestDelegate _next; /// <summary> /// 公共构造函数,参数是RequestDelegate类型 /// 通过构造函数进行注入,依赖注入服务会自动完成注入 /// </summary> /// <param name="next"></param> public RequestIPMiddleware(RequestDelegate next) { _next = next; } /// <summary> /// Invoke方法 /// 返回值是Task,参数类型是HttpContext /// </summary> /// <param name="context">Http上下文</param> /// <returns></returns> public async Task Invoke(HttpContext context) { await context.Response.WriteAsync($"User IP:{context.Connection.RemoteIpAddress.ToString()}\r\n"); // 调用管道中的下一个委托 await _next.Invoke(context); } } }
然后创建一个扩展方法,对IApplicationBuilder进行扩展:
using Microsoft.AspNetCore.Builder; namespace MiddlewareDemo.Middleware { public static class RequestIPExtensions { /// <summary> /// 扩展方法,对IApplicationBuilder进行扩展 /// </summary> /// <param name="builder"></param> /// <returns></returns> public static IApplicationBuilder UseRequestIP(this IApplicationBuilder builder) { // UseMiddleware<T> return builder.UseMiddleware<RequestIPMiddleware>(); } } }
最后在Startup类的Configure方法中使用自定义中间件:
// 使用自定义中间件 app.UseRequestIP();
运行程序,查看结果:
这样就完成了一个自定义中间件。
四、官方常用中间件
1、异常处理中间件
当应用程序在开发环境中运行时,开发人员异常页中间件(UseDeveloperExceptionPage)报告应用程序运行时的错误。
当应用程序在生产环境中运行时,异常处理中间件(UseExceptionHandler)捕获下面中间件中引发的异常。
2、HTTPS重定向中间件
HTTPS重定向中间件(UseHttpsRedirection)会将HTTP请求重定向到HTTPS。
3、静态文件中间件
静态文件中间件(UseStaticFiles)返回静态文件,并简化进一步请求处理。
4、Cookie中间件
Cookie策略中间件(UseCookiePolicy)使应用符合欧盟一般数据保护条例的规定。
5、路由中间件
路由中间件(UseRouting)用于路由的请求。
6、身份认证中间件
身份认证中间件(UseAuthentication)尝试对用户进行身份验证,验证通过之后才会允许用户访问安全资源。
7、授权中间件
授权中间件(UseAuthorization)用于授权验证通过的用户可以访问哪些资源。
8、会话中间件
会话中间件(UseSession)建立和维护会话状态。如果应用程序使用会话状态,请在Cookie策略中间件之后和MVC中间件之前调用会话中间件。
9、终结点路由中间件
终结点路由中间件(UseEndpoints)用于将Razor Pages终结点添加到请求管道。
更多中间件组件可以到aspnet 的GitHub仓库中查看:github.com/aspnet。
示例代码GitHub地址:github.com/jxl1024/Middleware
到此这篇关于ASP.NET Core中间件用法与官方常用中间件的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持自由互联。
本文共计1786个文字,预计阅读时间需要8分钟。
目录
一、什么是中间件
二、中间件和过滤器的区别
三、中间件常用方法
1.Run方法
2.Use方法
3.Map方法
4.Mapwhen方法
四、自定义中间件
五、官方常用中间件
1.异常处理中间件
2.HTTPS重定向
目录
- 一、什么是中间件
- 中间件和过滤器的区别
- 二、中间件常用方法
- 1、Run方法
- 2、Use方法
- 3、Map方法
- 4、Mapwhen方法
- 三、自定义中间件
- 四、官方常用中间件
- 1、异常处理中间件
- 2、HTTPS重定向中间件
- 3、静态文件中间件
- 4、Cookie中间件
- 5、路由中间件
- 6、身份认证中间件
- 7、授权中间件
- 8、会话中间件
- 9、终结点路由中间件
一、什么是中间件
我们都知道,任何的一个web框架都是把localhost:5000/Map1 app.Map(pathMatch: "/Map1", configuration: HandleMap1); // 匹配的URL:localhost:5000/Map2 app.Map(pathMatch: "/Map2", configuration: HandleMap2);
运行程序,然后在浏览器地址栏里面输入:localhost:5000/Map1,输出结果:
在地址栏里面在输入:localhost:5000/Map2,输出结果:
Map还支持嵌套,看下面的代码:
// 嵌套Map app.Map(pathMatch: "/Map1", configuration: App1 => { // App1.Map("/Map2",action=> { action.Run(async context => { await context.Response.WriteAsync("This is /Map1/Map2"); }); }); App1.Run(async context => { await context.Response.WriteAsync("This is no-map"); }); });
访问localhost:5000/Map1/123输出结果:
访问localhost:5000/Map1输出结果:
访问localhost:5000/Map1/Map2输出结果:
Map也可以同时匹配多个段,看下面的代码:
运行程序,输出结果:
访问localhost:5000/Map1/Map2输出结果:
4、Mapwhen方法
MapWhen是基于给定的谓词分支请求管道。任何使Func<HttpContext,bool>返回true的谓词的请求都被映射到新的管道分支。
我们先来看看Mapwhen方法的定义:
可以看出:MapWhen方法有两个参数:第一个参数是Func类型的委托,输入参数是HttpContext,输出参数是bool类型。第二个参数是Action委托,参数是IApplicationBuilder类型,表示也可以把实现Action委托的方法添加到中间件管道中执行。
看下面的例子,如果url中包括name查询参数,则执行HandleName方法,如果包含age查询参数,则执行HandleAge方法,否则执行Run()方法。
HandleName和HandleAge方法定义如下:
private void HandleName(IApplicationBuilder app) { app.Run(handler: async context => { await context.Response.WriteAsync(text: $"This name is: {context.Request.Query["name"]}"); }); } private void HandleAge(IApplicationBuilder app) { app.Run(handler: async context => { await context.Response.WriteAsync(text: $"This age is: {context.Request.Query["age"]}"); }); }
对应的MapWhen方法定义如下:
// 如果访问的url参数中包含name,则执行HandleName app.MapWhen( // Func委托,输入参数是HttpContext,返回bool值 predicate: context => { // 判断url参数中是否包含name return context.Request.Query.ContainsKey("name"); }, configuration: HandleName); // 如果访问的url参数中包含name,则执行HandleAge app.MapWhen( // Func委托,输入参数是HttpContext,返回bool值 predicate: context => { // 判断url参数中是否包含age return context.Request.Query.ContainsKey("age"); }, configuration: HandleAge); app.Run(async context => { await context.Response.WriteAsync("There is non-Map delegate \r\n"); });
运行程序,输出结果:
在url里面添加name查询参数输出结果:
在url里面添加age查询参数输出结果:
三、自定义中间件
在上面的例子中,我们都是使用的官方中间件自动的方法,其实我们也可以自己编写一个中间件。
中间件遵循显示依赖原则,并在其构造函数中暴露所有依赖项。中间件能够利用UseMiddleware<T>扩展方法的优势,直接通过它们的构造函数注入服务。依赖注入服务是自动完成填充的。
ASP.NET Core约定中间件类必须包括以下内容:
- 具有类型为RequestDelegate参数的公共构造函数。
- 必须有名为Invoke或InvokeAsync的公共方法,此方法必须满足两个条件:方法返回类型是Task、方法的第一个参数必须是HttpContext类型。
我们自定义一个记录IP的中间件,新建一个类RequestIPMiddleware,代码如下:
using Microsoft.AspNetCore.Http; using System.Threading.Tasks; namespace MiddlewareDemo.Middleware { /// <summary> /// 记录IP地址的中间件 /// </summary> public class RequestIPMiddleware { // 私有字段 private readonly RequestDelegate _next; /// <summary> /// 公共构造函数,参数是RequestDelegate类型 /// 通过构造函数进行注入,依赖注入服务会自动完成注入 /// </summary> /// <param name="next"></param> public RequestIPMiddleware(RequestDelegate next) { _next = next; } /// <summary> /// Invoke方法 /// 返回值是Task,参数类型是HttpContext /// </summary> /// <param name="context">Http上下文</param> /// <returns></returns> public async Task Invoke(HttpContext context) { await context.Response.WriteAsync($"User IP:{context.Connection.RemoteIpAddress.ToString()}\r\n"); // 调用管道中的下一个委托 await _next.Invoke(context); } } }
然后创建一个扩展方法,对IApplicationBuilder进行扩展:
using Microsoft.AspNetCore.Builder; namespace MiddlewareDemo.Middleware { public static class RequestIPExtensions { /// <summary> /// 扩展方法,对IApplicationBuilder进行扩展 /// </summary> /// <param name="builder"></param> /// <returns></returns> public static IApplicationBuilder UseRequestIP(this IApplicationBuilder builder) { // UseMiddleware<T> return builder.UseMiddleware<RequestIPMiddleware>(); } } }
最后在Startup类的Configure方法中使用自定义中间件:
// 使用自定义中间件 app.UseRequestIP();
运行程序,查看结果:
这样就完成了一个自定义中间件。
四、官方常用中间件
1、异常处理中间件
当应用程序在开发环境中运行时,开发人员异常页中间件(UseDeveloperExceptionPage)报告应用程序运行时的错误。
当应用程序在生产环境中运行时,异常处理中间件(UseExceptionHandler)捕获下面中间件中引发的异常。
2、HTTPS重定向中间件
HTTPS重定向中间件(UseHttpsRedirection)会将HTTP请求重定向到HTTPS。
3、静态文件中间件
静态文件中间件(UseStaticFiles)返回静态文件,并简化进一步请求处理。
4、Cookie中间件
Cookie策略中间件(UseCookiePolicy)使应用符合欧盟一般数据保护条例的规定。
5、路由中间件
路由中间件(UseRouting)用于路由的请求。
6、身份认证中间件
身份认证中间件(UseAuthentication)尝试对用户进行身份验证,验证通过之后才会允许用户访问安全资源。
7、授权中间件
授权中间件(UseAuthorization)用于授权验证通过的用户可以访问哪些资源。
8、会话中间件
会话中间件(UseSession)建立和维护会话状态。如果应用程序使用会话状态,请在Cookie策略中间件之后和MVC中间件之前调用会话中间件。
9、终结点路由中间件
终结点路由中间件(UseEndpoints)用于将Razor Pages终结点添加到请求管道。
更多中间件组件可以到aspnet 的GitHub仓库中查看:github.com/aspnet。
示例代码GitHub地址:github.com/jxl1024/Middleware
到此这篇关于ASP.NET Core中间件用法与官方常用中间件的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持自由互联。

