# 如何简单能成为 ASP@. @NET blog really Be?_

<!--category-- ASP.NET, Markdown, Blogging -->
<datetime class="hidden">2025-12-01T12:00</datetime>

## 一. 导言导言 导言 导言 导言

如果你一直关注这个博客, ' ,}你可能会注意到我的主要部落格平台是 @... Letñ's, 它叫做“"enthusiastical 工程设计”\."PostgreSQL 和矢量数据库@, smantic and full- text weating with GIN Inviolu=%,}自动翻譯为「14 语言 @MS K10多个主机服务}{,_Hangfire 工作日程安排}, Prometheus mindosMS},Serilog 跟踪HTMX互动{HTMTexpactiving@MS15us usign my nugget producle*}和足够多的杜克容器来制造一艘飞船嫉妒性".}

**{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}这真是深思熟虑** 这个网站是我的活实验室 - 是一个操场 我在那里实验技术 □, 测试部署策略}MS K2 测量性能特性 *假定* @,}然后把这些解决方案包装成 Open@-来源库, 其他人可以使用#.{

但这里是事情 : **您可能不需要这些来运行一个博客@. @%**

这就是为什么我创造了 **多数为lucid @ . @ 微小Blog** @-@ 显示当您剥去所有实验内容并关注绝对基本需要时会发生什么, 没有数据库=.} 不建管道.}没有复杂吗?. 只是在网络上出现的文件夹\MS K5}中标记文件*%.}这就是博客看起来的样子 当你不把它用作实验室.

> Onte: 参见此文章结尾与来源的链接@,I计划将此作为 [篮子软件包](https://www.nuget.org/packages?q=mostlylucid&includeComputedFrameworks=true&prerel=true&sortby=relevance) 一旦我得到时间确保它"'QAS 100%"可靠,而且它的"'QQSperf" 是''QQT ToO 可怕的'MS K4QZoso 寻找"K6Q"测试文章

[TOC]

## 更低的哲学

整个项目围绕一项原则设计, **保持简单**.沒有資料庫,沒有建構管道MS K2沒有 JavaScript frame.只是 ASP}.NETMSKO5馬克迪
您甚至可以使用类似 [下调@- @it](https://github.com/markdown-it/markdown-it) 然后只有服务器站点地图静态 `.md` 并连 SIMPLER 文件, 但@... @ well 这是 ASP.}NET 博客 @ (_ kinda sorta {🤓).} 。

## 项目结构

让我们看看这个项目是如何组织起来的。

```
Mostlylucid.MinimalBlog/
├── Pages/
│   ├── Index.cshtml              # Homepage with post list
│   ├── Post.cshtml                # Individual post page
│   ├── Categories.cshtml          # List of all categories
│   ├── Category.cshtml            # Posts in a category
│   ├── _Layout.cshtml             # Shared layout
│   ├── _ViewImports.cshtml        # Shared imports
│   └── _ViewStart.cshtml          # Layout selection
├── wwwroot/
│   └── css/
│       └── site.css               # All the CSS you need
├── MarkdownBlogService.cs         # Core blog logic
├── MetaWeblogService.cs           # XML-RPC for external editors
├── Program.cs                     # Application setup
├── appsettings.json               # Configuration
└── Mostlylucid.MinimalBlog.csproj # Project file
```

## 心脏@: @ 马克唐布劳尔服务

博客的核心是 `MarkdownBlogService` 类@. @ it'_Qs 非常简单 @ - @ just *120} 处理\:{的代码行

1. 从目录读取标记下载文件
2. 正在解析元数据 ( title, n分类 ,}发布日期{)
3. 使用Markdig 将记分转换为 HTML
4. 将一切隐藏在记忆中

这里:'}它是如何工作的?

### 正在加载员额

服务扫描已配置的目录 `.md` 并把它们全部装入内存@: @%

```csharp
private List<BlogPost> LoadAllPosts()
{
    if (!Directory.Exists(_markdownPath)) return [];

    return Directory.GetFiles(_markdownPath, "*.md", SearchOption.TopDirectoryOnly)
        .Where(f => Path.GetFileName(f).Count(c => c == '.') == 1) // Only base .md files
        .Select(ParseFile)
        .Where(p => p is { IsHidden: false })
        .OrderByDescending(p => p!.PublishedDate)
        .ToList()!;
}
```

注意聪明的过滤器: `Count(c => c == '.') == 1` 确保我们只有基础 `.md` {,没有这样的翻译版本 `post.ar.md` 或 `post.de.md` @ (_ @ in case you want to addate transfer later * MS K1} 如果您想要在稍后添加译文, @ MPK1

### 解析元数据

每个标记下载文件遵循简单的常规@ : @ {}

```markdown
# Post Title

<!-- category -- Category1, Category2 -->
<datetime class="hidden">2024-11-30T12:00</datetime>

Your content here...
```

解析器使用正则表达式和 Markdig AST: 提取此元数据

```csharp
private BlogPost? ParseFile(string filePath)
{
    var markdown = File.ReadAllText(filePath);
    var slug = Path.GetFileNameWithoutExtension(filePath);
    var document = Markdown.Parse(markdown, _pipeline);

    // Extract title from first H1
    var title = document.Descendants<HeadingBlock>()
        .FirstOrDefault(h => h.Level == 1)?
        .Inline?.FirstChild?.ToString() ?? slug;

    // Extract categories: <!-- category -- Cat1, Cat2 -->
    var categoryMatch = CategoryRegex().Match(markdown);
    var categories = categoryMatch.Success
        ? categoryMatch.Groups[1].Value.Split(',', StringSplitOptions.TrimEntries)
        : [];

    // Extract date: <datetime class="hidden">2024-01-01T00:00</datetime>
    var dateMatch = DateTimeRegex().Match(markdown);
    var publishedDate = dateMatch.Success && DateTime.TryParse(dateMatch.Groups[1].Value, out var dt)
        ? dt : File.GetCreationTimeUtc(filePath);

    return new BlogPost
    {
        Slug = slug,
        Title = title,
        Categories = categories,
        PublishedDate = publishedDate,
        HtmlContent = Markdown.ToHtml(markdown, _pipeline),
        IsHidden = markdown.Contains("<hidden")
    };
}
```

### 缓结战略

服务使用的每一种方法 `IMemoryCache` 以避免在每次请求中重新@ - @ 读取和重新% MS K1} parsing 文件@ MPK2

```csharp
public IReadOnlyList<BlogPost> GetAllPosts()
{
    return cache.GetOrCreate("all_posts", entry =>
    {
        entry.SetOptions(CacheOptions);
        return LoadAllPosts();
    }) ?? [];
}
```

缓存条目有一个“% 30-” 即时滑动过期和“ 2-” 小时绝对到期@ MS K2 @ simple @ MSC3} 有效.{

## 应用程序设置@:程序 @.}%cs

整个应用程序设置仅是 @43 @ line@ : @ Razor Pages,}%,}输出缓存{,} two sington service *,}提供<,> 的静态文件 和 MetaWeblog XMLQ}-RPC 端点}.}所有东西都作为单吨存储,因为除非文件被修改,否则不会发生任何变化.}

## UI: 简单剃刀页面

用户名为纯服务器@- @ rendered HTML\% .}No JavaScript,}不使用 HTMX_,}无 Alpine{.}{js}.}主页列表 `@Html.Raw(post.HtmlContent)` 具有 a 和 `[OutputCache]` 用于 hour@- @ long HTML caching @ .}四页总和\ ,} 每人在 @ OMK3 线下=.}

## CSS 的线条

整个视觉设计由单一的 CSS 文件处理, 它只使用 @ 55} 线条@ MS K1} 使用 CSS 自定义属性来管理它们, 并创建一个干净的Q, dark GitHub-\ impirated look * :}

```css
:root {
  --bg: #0d1117;
  --bg-card: #161b22;
  --text: #c9d1d9;
  --text-muted: #8b949e;
  --accent: #58a6ff;
  --border: #30363d;
}

body {
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  background: var(--bg);
  color: var(--text);
  line-height: 1.6;
  max-width: 48rem;
  margin: 0 auto;
  padding: 2rem 1rem;
}

/* ... more styles ... */
```

没有前处理器@ . @ no build step_ .}没有数千个通用分类 * .\ 只是清理*,}可读的 CSS

## MetaWeblog API 文摘:

对于那些喜欢专门减记编辑的作家来说 [标记怪物Name](https://markdownmonster.west-wind.com/)@, 这个项目包括完整的 MetaWeblog API 实施@. 此 XML=-RPC APIC 允许外部编辑@MS K3}

- 名单员额
- 创建新职位
- 编辑现有员额
- 删除员额
- 上传图像
- 检索分类

正在执行 `MetaWeblogService.cs` 并处理完整的 XML-RPC 协议@, 解析请求和生成响应\ . 这意味着你可以在您最喜爱的编辑器中写下您的博客文章,然后直接发布到您的博客 @.}

## 配置配置

整个配置文件仅是 @ 14_ line@ MS K1}

```json
{
  "MarkdownPath": "../Mostlylucid/Markdown",
  "ImagesPath": "wwwroot/images",
  "MetaWeblog": {
    "Username": "admin",
    "Password": "changeme",
    "BlogUrl": "http://localhost:5000"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information"
    }
  }
}
```

- `MarkdownPath` - 您的标记文件所在位置@ info
- `ImagesPath` 存储图像的 -
- `MetaWeblog` - 外部编辑器访问证书

## 用作 NuGet 软件包

> 如前所述,它将提供SOON系统,但尚未提供“:)”

该博客现以NuGet profession@,#提供, 使得添加到任何 ASP @.}{NET Core application_:\}

```bash
dotnet add package mostlylucid.MinimalBlog
```

然后在你的 `Program.cs`:

```csharp
builder.Services.AddRazorPages();
builder.Services.AddMinimalBlog(options =>
{
    options.MarkdownPath = "Markdown";
    options.ImagesPath = "wwwroot/images";
    options.EnableMetaWeblog = false; // Optional, defaults to true
});

var app = builder.Build();

app.UseStaticFiles();
app.UseMinimalBlog();
app.MapRazorPages();
app.Run();
```

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}只有两种方法`AddMinimalBlog` 和 `UseMinimalBlog`@)和您有一个工作博客#.

## 运行样本工程

要运行包含的样本项目 @:

```bash
cd Mostlylucid.MinimalBlog
dotnet run
```

访问 `http://localhost:5000` 您将会从配置路径@ . t查看带有标记文件的博客

## 创建内容

创建新博客 post @:

1. 创建新 `.md` 在您配置的文件中 `MarkdownPath`
2. 添加标准元数据@: @%
   ```markdown
   # Your Post Title
   
   <!-- category -- YourCategory, AnotherCategory -->
   <datetime class="hidden">2024-11-30T12:00</datetime>
   
   Your content here...
   ```
3. 保存文件
4. 缓存将在 @ 30 @ minutes @ MPK1@ or 重新启动 AppZ)}内过期

要添加图像@, 仅将其放置在您的配置中 `ImagesPath` 在您的标记下调@ :中引用目录并引用它们

```markdown
![Alt text](your-image.jpg)
```

## 什么'Qs 错过了\(}目的=)}

这个最小的博客故意不包含 @' @t 包括@:}

- **评论意见评论评论评论意见** 必要的话,请使用第三种服务
- **搜索** - 保持您的内容按类别排列
- **标签标记** @-_ 分类对于小博客来说已经足够了
- **RSS/阿托姆** “-”简单添加,如果需要的话
- **验证** M-MetaWeblog API 只使用基本经认证
- **分析分析** - 添加 JavaScript 片段( 如需要)
- **SEO优化** -用基本元标签效果很好
- **响应图像** - 浏览器处理它
- **DarkM/光主题切换** 只有一个主题就够了

这些特征都是 *可能* 添加@ , @ {, 但是它们没有默认包含% 1} 因为大多数小博客don' 需要它们的@ MPK3}

## 性能特点

尽管这个博客简单, **快速快**:

- **内存缓存** 表示第一个装入后没有文件 I/O
- **输出缓存** 表示在第一次请求后,没有 Razor 显示
- **无数据库** 意指不询问间接费用
- **无 JavaScript** 表示快速的页面负荷
- **简单 CSS** 表示最小样式表解析

对于一个中小博客 {(}under 1000}posts @),}这个架构将超过大多数数据库=-}支持的博客平台@.}

## 何时使用此 vs @ . @ the full Mostlylucid 博客

使用 **最优lucid\ . 微小Blog** 当:

- 您正在启动个人博客,
- 您的邮资少于 @500
- 您不需要多种语言
- 你想把事情简单化
- 您对标记文件感到舒服@ ' @ label
- 你只想写和出版

使用 **完全最湿润的平台** 当:

- @' 使用您的博客作为 **学习实验室** 采用新技术的新的技术
- 您想要实验部署策略@ ,监测 @ MS K1和性能优化
- 您需要特定功能, 如多语种支持@ , @ full @ MS K1\ text search_ ,} 或批注
- 你正在建造一个软件包 需要一个真正的-世界测试台
- 您正在记录复杂的技术实施
- 建造平台的旅程与平台所容纳的内容一样宝贵

## 结论: 简单性作为地物

在现代网络开发世界中,我们通常会通过默认的“.” 找到复杂的解决方案。我们需要一个博客 “?” 更好地设置一个数据库@, 配置 ORM, 配置一个 ORCM}设置移民+, 添加 caching\,实施搜索 @,配置背景工作_...}

但有时简单的解决办法是 *右对右* maintimalBlog 证明您可以建立一个功能性@ , fast\ , 并用 @ MS K4}维护可维护的博客平台

- **C#的 342 线条** ( @MakdownBlogService@+ @MetaWeblogs Services @+程式$.{cs})
- **~120Razor 标记線** “(4”页面“)”
- **55CSS的线条**
- **1NuGet 依赖性** 马克迪戈・马科迪・马斯基1

那个M' **总代码行数小于 @ 520%** 完整博客平台@. @%

此工程既是一个功能性博客平台, 也是一种提醒@ : @ 。 在您添加复数前请先询问自己是否真的需要它 ,} 有时您只需要一个满载标记文件的文件夹\ MS K3}

您可以在 The 中找到完整的源代码 [Mostlucid\ . minimalBlog 目录](https://github.com/scottgal/mostlylucidweb/tree/main/Mostlylucid.MinimalBlog) 主仓库@ . @ I'} 只要I'# m 对代码满意, 即会释放金字塔包\ MS K3}

快乐博客@! @#