posts - 609,  comments - 13,  views - 64万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
逻辑:增加一个自定义注解Attribute,在中间件中判断注解中是否配置了跳过该中间件,跳过则直接await _next(httpContext);
主要是在中间件中获取自定义注解。
自定义注解
复制代码
namespace XCGWebApp.Attributes
{
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
    public class SkipMiddlewareAttribute : Attribute
    {
        public SkipMiddlewareAttribute()
        {
            SkipMiddlewareNames = "";
        }
        public SkipMiddlewareAttribute(string names)
        {
            SkipMiddlewareNames = names;
        }
        /// <summary>
        /// 跳过的中间件名称,逗号分隔
        /// </summary>
        public string SkipMiddlewareNames { get; set; } = string.Empty;
    }
}
复制代码

api示例方法,SkipMiddleware也可以加到类上。

[HttpGet]
[SkipMiddleware("MyMiddleware")]
public string test()
{
    return "hello";
}

MyMiddleware示例

复制代码
using XCGWebApp.Attributes;

namespace XCGWebApp.MiddleWare
{
    public class MyMiddleware
    {
        private readonly RequestDelegate _next;  // 用来处理上下文请求 
        private readonly ILogger<MyMiddleware> _logger;
        public MyMiddleware(RequestDelegate next, ILogger<MyMiddleware> logger)
        {
            _next = next;
            _logger = logger;
        }
        public async Task InvokeAsync(HttpContext httpContext)
        {
            var guid = Guid.NewGuid().ToString();
            bool skipThis = false;
            var endpoint = httpContext.GetEndpoint();
            if (endpoint != null)
            {
                var skipAttribute = endpoint.Metadata.GetMetadata<SkipMiddlewareAttribute>();
                if (skipAttribute != null && !string.IsNullOrEmpty(skipAttribute.SkipMiddlewareNames) && skipAttribute.SkipMiddlewareNames.Contains(this.GetType().Name))
                {
                    skipThis = true;
                }
            }

            //不跳过该中间件
            if (!skipThis)
            {
                //do somthing...
            }
            else
            {
                _logger.LogInformation("跳过该skipmiddleware中间件");
            }
            await _next(httpContext);
        }
    }

    /// <summary>
    /// 扩展函数
    /// </summary>
    public static class MyMiddlewareExtensions
    {
        public static IApplicationBuilder UseMyMiddleware(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<MyMiddleware>();
        }
    }
}
复制代码

 

posted on   邢帅杰  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2018-08-21 TLS1.1升级到TLS1.2(微信小程序要求TLS1.2以上)
点击右上角即可分享
微信分享提示