ASP.NET Core中间件Markdown转换器

目录

需求

文本编码检测

Markdown→HTML

注意

实现


需求

  1. Markdown是一种文本格式;不被浏览器支持;编写一个在服务器端把Markdown转换为HTML的中间件。
  2. 我们开发的中间件是构建在ASP.NET Core内置的StaticFiles中间件之上,并且在它之前运行,所有的*.md文件都被放到wwwroot文件夹下,当我们请求wwwroot下其他的静态文件的时候,StaticFiles中间件会把它们返回给浏览器,而当我们请求wwwroot下的*.md文件的时候,我们编写的中间件会读取对应的*.md文件并且把它们转换为HTML格式返回给浏览器。

文本编码检测

Nuget:Install-Package UTF.Unknown

cs 复制代码
DetectionResult result = CharsetDetector.DetectFromStream(stream);
string charset = result.Detected.EncodingName

CharsetDetector/UTF-unknown: Character set detector build in C# - .NET 5+, .NET Core 2+, .NET standard 1+ & .NET 4+https://github.com/CharsetDetector/UTF-unknownhttps://github.com/CharsetDetector/UTF-unknownhttps://github.com/CharsetDetector/UTF-unknownhttps://github.com/CharsetDetector/UTF-unknown

Markdown→HTML

Nuget:Install-Package MarkdownSharp

cs 复制代码
Markdown markdown = new Markdown();
string html = markdown.Transform(mdText);

注意

app.UseMiddleware<MarkdownMiddleware>();需在app.UseStaticFiles();之前注册,如果先注册了静态文件中间件,那么所有对静态文件的请求都会直接由静态文件中间件处理,而不会经过你的自定义中间件。

cs 复制代码
app.UseMiddleware<MarkdownMiddleware>();
//配置服务器为静态文件提供服务
app.UseStaticFiles();

实现

cs 复制代码
public class MarkdownMiddleware
{
    private readonly RequestDelegate _next;
    private readonly IWebHostEnvironment hostEnv;
    public MarkdownMiddleware(RequestDelegate next, IWebHostEnvironment hostEnv)
    {
        _next = next;
        this.hostEnv = hostEnv;
    }
    public async Task InvokeAsync(HttpContext context)
    {
        //获取请求路径
        var path = context.Request.Path.Value;
        //判断请求路径是否以.md结尾
        if (!path.EndsWith(".md", true, null))
        {
            await _next(context);
            return;
        }
        //判断请求路径是否存在
        var file = hostEnv.WebRootFileProvider.GetFileInfo(path);
        if (!file.Exists)
        {
            await _next(context);
            return;
        }
        //读取文件流
        using var stream = file.CreateReadStream();
        //UTF.Unknown检测文件编码,获取检测结果
        DetectionResult result = CharsetDetector.DetectFromStream(stream);
        string charset = result.Detected.EncodingName ?? "UTF-8";
        //流的位置重置
        stream.Position = 0;
        //读取文件内容,并指定编码
        using StreamReader reader = new StreamReader(stream, Encoding.GetEncoding(charset));
        string mdText = await reader.ReadToEndAsync();
        //将Markdown转换为HTML
        Markdown markdown = new Markdown();
        string html = markdown.Transform(mdText);
        //设置响应头
        context.Response.ContentType = "text/html;charset=UTF-8";
        await context.Response.WriteAsync(html);
    }
}
相关推荐
235169 小时前
【Redis】缓存击穿、缓存穿透、缓存雪崩的解决方案
java·数据库·redis·分布式·后端·缓存·中间件
支付宝体验科技14 小时前
支付宝开源移动端流式 Markdown 渲染引擎 FluidMarkdown
markdown
DBWYX1 天前
ShardingSphere 分布式数据库中间件生态
数据库·分布式·中间件
Zfox_1 天前
【C++项目】微服务即时通讯系统:服务端
数据库·c++·微服务·中间件·rpc·架构·即时通讯
一條狗2 天前
学习日报 20250921|MQ (Kafka)面试深度复盘
java·中间件·kafka
你的微笑,乱了夏天2 天前
spring boot项目使用Torna生成在线接口文档
java·spring boot·中间件·postman
承悦赋2 天前
初识Redis:解锁高性能缓存的魔法钥匙
数据库·spring boot·redis·分布式·缓存·中间件
Simon_He9 天前
这次来点狠的:用 Vue 3 把 AI 的“碎片 Markdown”渲染得又快又稳(Monaco 实时更新 + Mermaid 渐进绘图)
前端·vue.js·markdown
weixin_4569042711 天前
跨域(CORS)和缓存中间件(Redis)深度解析
redis·缓存·中间件
Simon_He11 天前
一款适用于 Vue 的高性能流式 Markdown 渲染器,源自我们的 AI 聊天机器人
前端·vue.js·markdown