ASP.NET Core 3.1中Middleware和Filter用法实践
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了ASP.NET Core 3.1中Middleware和Filter用法实践,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3532字,纯文字阅读大概需要6分钟。
内容图文
ASP.NET Core 3.1中Middleware和Filter用法实践
前言
在我们用ASP.NET Core进行开发的过程中经常使用到两种AOP技术中间件(Middleware)和过滤器(Filter),很多时候两个组件有很多相似的用法,具体什么场景应用什么组件其实是很模糊的,下面我通过自己的实践和举例来进行讲解。
组件介绍
具体Middleware和Filter各自怎么用,已经有很多文章和Demo参考,今天我们来说一下,Filter和Middleware在Request请求中的顺序问题,在微软官网文档中在对Filters介绍之前有这样一段话
Filters run within the ASP.NET Core action invocation pipeline, sometimes referred to as the filter pipeline. The filter pipeline runs after ASP.NET Core selects the action to execute.
还有一张图示如下:
通过该段说明和图示我们可以知道,Request首先是经过系统或我们自定义的Middleware之后经过Action Selection,然后才会进入Filter Pipeline。
实践举例
下面来提供一个Middleware和Filter联合使用的场景,分别用到TraceIdMiddleware,ExceptionMiddleware和TokenFilter
TraceIdMiddleware主要用于拦截Request,检查是否带有traceid这个Header,如果没有就添加一个traceid的header到Request请求中,代码如下:
public class TraceIdMiddleware
{
private readonly RequestDelegate _next;
public TraceIdMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
string traceid = null;
if (context.Request.Headers.TryGetValue("traceid", out var htraceId))
{
traceid = htraceId.ToString();
}
if (string.IsNullOrEmpty(traceid))
{
traceid = Guid.NewGuid().ToString();
context.Request.Headers.Add("traceid", traceid);
}
await _next.Invoke(context);
}
}
public static class TraceIdMiddlewareExtensions
{
public static IApplicationBuilder UseTraceId(this IApplicationBuilder builder)
{
return builder.UseMiddleware<TraceIdMiddleware>();
}
}
ExceptionMiddleware为全局捕获异常中间件,用于全局拦截我们代码中未catch的异常,返回统一格式。代码如下:
public class ExceptionMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<ExceptionMiddleware> _logger;
public ExceptionMiddleware(RequestDelegate next, ILogger<ExceptionMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task Invoke(HttpContext context)
{
try
{
await _next.Invoke(context);
}
catch (Exception e)
{
await HandleException(context, e);
}
}
private async Task HandleException(HttpContext context, Exception e)
{
context.Response.StatusCode = 200;
context.Response.ContentType = "text/json;charset=utf-8;";
_logger.LogError(e.Message);
string error = JsonSerializer.Serialize(new { Code = 500, Message = e.Message });
await context.Response.WriteAsync(error);
}
}
public static class ExceptionMiddlewareExtensions
{
public static IApplicationBuilder UseException(this IApplicationBuilder builder)
{
return builder.UseMiddleware<ExceptionMiddleware>();
}
}
TokenFilter实现了接口,获取请求中的token并验证其合法性。具体代码如下:
public class TokenFilter : Attribute, IAuthorizationFilter
{
private readonly ILogger<TokenFilter> _logger;
public TokenFilter(ILogger<TokenFilter> logger)
{
_logger = logger;
}
public void OnAuthorization(AuthorizationFilterContext context)
{
string token = null;
if (context.HttpContext.Request.Headers.TryGetValue("token", out var utoken))
{
userToken = utoken.ToString();
}
if (string.IsNullOrEmpty(userToken))
{
var traceId = context.HttpContext.Request.Headers["traceid"].ToString();
_logger.LogInformation($"traceId:{traceId},Error:认证失败");
throw new Exception("认证失败");
}
// something else
}
}
三个组件执行时序图如下:
Requset请求首先进入TraceIdMiddleware,检测是否有traceid的header,没有则赋值,然后经过ExceptionMiddleware不对Request进行处理,在TokenFilter中验证token,如果token无效则记录日志并抛出异常,日志中包含header中的traceid,在返回路径中ExceptionMiddleware将会捕获返回值中的Exception,统一返回格式并返回。
总结
通过以上的例子我们可以总结出两点:
- Middleware执行于Action Selection之前,所以我们应该将一些业务无关的功能放在Middleware中,而将一些业务相关的内容放在Filter中来处理。
- 在同时使用Middleware和Filter时,一定要注意使用顺序,以免出现不必要的异常。
原文:https://www.cnblogs.com/sxwsivan/p/14003028.html
内容总结
以上是互联网集市为您收集整理的ASP.NET Core 3.1中Middleware和Filter用法实践全部内容,希望文章能够帮你解决ASP.NET Core 3.1中Middleware和Filter用法实践所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。