[Asp.Net Core]C#解析Markdown文档
Posted 厦门德仔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Asp.Net Core]C#解析Markdown文档相关的知识,希望对你有一定的参考价值。
C#解析Markdown文档
通常我们写博客时候通常可以markdown类似写代码的方式又可以呈现html的效果。也很多离线的markdown编辑器然后写好之后导入到网站,或者在线markdown编写。
C#如何解析markdown文档呢?
1.什么时候Markdown;不被浏览器支持;所以,编写一个在服务器端把markdown转换为HTML的中间件。
2,我们开发的中间件是构建在ASP.NET Core内置的staticFiles中间之上,并且在它之前运行,所有的md文件都被放到wwwroot文件夹下,当我们请求wwwroot下其他的静态文件的时候,StaticFiles中间件会把他们返回给浏览器,而当我们请求wwwroot下的.md文件的时候,我们编写的中间件会读取对应的.*文件并且把它们转化为HTML格式返回给浏览器。
需要探测文件的编码格式:
文本编码检测
NuGet包:Ude NetStandard
调用charsetDetector类来探测文件的编码
/// <summary>
/// 检测流的编码
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
private static string DetectCharset(Stream stream)
CharsetDetector charDetector = new();
charDetector.Feed(stream);
charDetector.DataEnd();
string charset = charDetector.Charset ?? "UTF-8";
stream.Position = 0;
return charset;
MD->HTML
引入NuGet包:MarkdownSharp(也可以搜索其他的包)
Markdown markdown=new Markdown();
String html=markdown.Transform(text);
自定义MarkDownViewerMiddleware中间类
public class MarkDownViewerMiddleware
private readonly RequestDelegate next;
private readonly IWebHostEnvironment hostEnv;
private readonly IMemoryCache memCache;
public MarkDownViewerMiddleware(RequestDelegate next,
IWebHostEnvironment hostEnv, IMemoryCache memCache)
this.next = next;
this.hostEnv = hostEnv;
this.memCache = memCache;
/// <summary>
/// 检测流的编码
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
private static string DetectCharset(Stream stream)
CharsetDetector charDetector = new();
charDetector.Feed(stream);
charDetector.DataEnd();
string charset = charDetector.Charset ?? "UTF-8";
stream.Position = 0;
return charset;
/// <summary>
/// 读取文本内容
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
private static async Task<string> ReadText(Stream stream)
string charset = DetectCharset(stream);
using var reader = new StreamReader(stream, Encoding.GetEncoding(charset));
return await reader.ReadToEndAsync();
public async Task InvokeAsync(HttpContext context)
string path = context.Request.Path.Value ?? "";
if (!path.EndsWith(".md"))
await next(context);
return;
var file = hostEnv.WebRootFileProvider.GetFileInfo(path);
if (!file.Exists)
await next(context);
return;
context.Response.ContentType = $"text/html;charset=UTF-8";
context.Response.StatusCode = 200;
string cacheKey = nameof(MarkDownViewerMiddleware)
+ path + file.LastModified;
var html = await memCache.GetOrCreateAsync(cacheKey, async ce =>
ce.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1);
using var stream = file.CreateReadStream();
string text = await ReadText(stream);
Markdown markdown = new Markdown();
return markdown.Transform(text);
);
await context.Response.WriteAsync(html);
use自定义中间
注意:需要app.UseStaticFiles();之前。
app.UseMiddleware<MarkDownViewerMiddleware>();
测试
1.md 文档格式
2. 程序解析
资料参考:
1.https://vimsky.com/examples/detail/csharp-ex-MarkdownSharp-Markdown-Parse-method.html
2.
以上是关于[Asp.Net Core]C#解析Markdown文档的主要内容,如果未能解决你的问题,请参考以下文章
更改 ASP.NET Core 中 DateTime 解析的默认格式
Mediatr 无法解析 ASP.Net Core 中的 UserManager
ASP.NET Core Web API使用静态swagger.json文件