很简单的自定义友好链接实现 .net core 2

对于现在流行网站来说,内容的访问路径只使用 id 已经不能满足了,以下提供一个简单的中间件可以自由的用数据库来自定义网站内容的友好链接,此方法完全不需要您再为每个不同的表加友好链接字段,通用性更好。

记录表

    /// <summary>
    /// 短链接记录,对应 shortlinks 表
    /// </summary>
    [Table("shortlinks")]
    public class ShortLink
    {
        [Key]
        [StringLength(128)]
        public string Path { get; set; }

        [Required]
        [StringLength(1024)]
        public string Link { get; set; }

        [StringLength(45)]
        public string RefType { get; set; }

        [StringLength(32)]
        public string RefId { get; set; }

        public bool Enable { get; set; }
    }

中间件

    /// <summary>
    /// 基于数据库中 ShortLink 的设置重写请求
    /// </summary>
    class ShortLinkMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly ILogger<ShortLinkMiddleware> _logger;

        public ShortLinkMiddleware(RequestDelegate next, ILogger<ShortLinkMiddleware> logger)
        {
            _next = next;
            _logger = logger;
        }

        public async Task InvokeAsync(HttpContext context, IMemoryCache cache)
        {
            // 从缓存或数据库中读取短链接对应关系
            var links = await cache.GetOrCreateAsync(typeof(ShortLinkMiddleware), async e =>
            {
                // 设置缓存 15 分钟
                e.SetAbsoluteExpiration(TimeSpan.FromMinutes(15));
                // 获取数据访问上下文
                var db = context.RequestServices.GetRequiredService<AppDbContext>();
                // 从数据库读取启用状态的短链接
                return await db.ShortLinks.Where(s=>s.Enable).ToListAsync();
            });

            // 获取当前访问路径适配的短链接记录
            var matchLink = links.FirstOrDefault(l => l.Path == context.Request.Path);
            if(matchLink != null)
            {
                // 输出转换日志并修改当前请求的 Path
                _logger.Log(LogLevel.Trace, $"ShortLink {matchLink.Path} To {matchLink.Link}");
                context.Request.Path = matchLink.Link;
            }
            // 调用管道中的下一个委托或中间件
            await _next(context);
        }
    }

注册中间件

在 Startup.cs 的 Configure 方法中加入 app.UseMiddleware<ShortLinkMiddleware>();

转载于:https://my.oschina.net/jock/blog/1923362

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值