[ASP.Net Core] 创建 Markdown 转换器中间件

为什么要创建 Markdown 转换器中间件:

Markdown 文件是不被浏览器支持的,所以如果想要看到其效果,需要将其转换为 HTML 格式。而 Asp.Net Core 中没有可以将 Markdown 转换为 HTML 格式的中间件。一般来讲,我们都会将 Markdown 文件存放到 wwwroot 文件夹下(wwwroot 简介

如何去写:

1.我们需要去创建一个中间件类:
即创建一个普通的类,该类中声明一个必须含有 RequestDelegate 类型参数的构造器,也可以添加其他的参数,再声明一个 Invoke 或者 InvokeAsync 名字的 至少含有 HttContext 类型参数的方法。
如下:

	//书写一个中间件的案例
    public class MarkdownMiddleware
    {
        private readonly RequestDelegate next;

        //定义一个至少有一个 RequestDelegate 参数的构造器
        public MarkdownMiddleware(RequestDelegate next)
        {
            this.next = next;
        }

        //书写一个 Invoke 或者 InvokeAsync 的方法,方法至少有一个 HttpContext 类型的参数
        public async Task InvokeAsync(HttpContext context)
        {
            context.Response.WriteAsync("TestMiddleware Start <br/>");

            await next.Invoke(context);

            context.Response.WriteAsync("TestMiddleware End <br/>");

        }
    }

2.再该中间件类的基础上进行代码填充:
(1)需要用到 IWebHostEnvironment 接口,通过接口来访问我们放在 wwwroot 文件中的 Markdown 静态文件
(2)再在 Invoke 或者 InvokeAsync 方法名的方法中书写我们对 Markdown 文件的操作,如果该文件不存在,或者返回给我们的地址不是以 .md 结尾的,我们就直接调用下一个中间件,继续其他的操作。

	public class MarkdownMiddleware
    {
        private readonly RequestDelegate next;
        public readonly IWebHostEnvironment HostEnv;//读取静态文件

        public MarkdownMiddleware(RequestDelegate next, IWebHostEnvironment hostEnv)
        {
            this.HostEnv = hostEnv;
            this.next = next;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            //获取请求内容的路径
            string path = context.Request.Path.ToString();

            //查看其是否以 .md 结尾并且按照当前区域不区分大小写
            if (!path.EndsWith(".md", true, CultureInfo.CurrentCulture))
            {
                //如果不是 Markdown 文件,就直接指向下一个中间件
                await next.Invoke(context);
                return;
            }
           
            //通过 IWebHostEnvironment 来获取文件
            IFileInfo file = HostEnv.WebRootFileProvider.GetFileInfo(path);
            //如果文件不存在,直接调用下一个中间件
            if (!file.Exists)
            {
                await next.Invoke(context);
                return;
            }

            //对 Markdown 文件进行处理
            //将该文件转换为 流数据局
            using Stream stream = file.CreateReadStream();
            //调用第三方包 Ude.NetStandard 来查看 该流使用的什么编码格式
            Ude.CharsetDetector cdet = new Ude.CharsetDetector();
            cdet.Feed(stream);
            cdet.DataEnd();
            //有可能看不出来该文件使用的是什么编码格式,返回的为 null,如果为空我就将其看成 "UTF-8"
            string charset = cdet.Charset ?? "UTF-8";

            
            //由于上面调用第三方包看该流的编码格式,已经使该流的指针位置发生了改变,所以应该将其指针位置复原
            stream.Position = 0;
            //通过 StreamReader 类从流中以特定的格式读取数据,
            StreamReader sr = new StreamReader(stream, Encoding.GetEncoding(charset));
            string mdFile = await sr.ReadToEndAsync();

            //将 mdFile 数据转换成 HTML 类型,在界面上展示
            //同样有现成的第三方包: MarkdwonSharp 这种包其实很多,可以去 nuget 上去找
            Markdown markdown = new Markdown();
            string mdHtml = markdown.Transform(mdFile);
            //将其输出到界面上
            context.Response.ContentType = "text/html";
            await context.Response.WriteAsync(mdHtml);

        }
    }

如何调用该中间件类:

app.UseMiddleware<MarkdownMiddleware>();

注意:

需要将该 Markdown 转换器中间件 添加在 StaticFiles 中间件的前方,因为 StaticFiles 中间件 也会对 静态文件进行处理,如果 Markdown 转换器中间件 放到后面, StaticFiles 就会先我们把对 Markdown 静态文件的操作给做了,就不会到我们所写的 Markdown 转换器中间件了
如下:

app.UseMiddleware<MarkdownMiddleware>();
app.UseStaticFiles();//StaticFiles 中间件调用
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值