# meistlucid ,. ,MinimalBlog , wie einfach kann ein ASP-. ,NET Blog wirklich Be , ? ,

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

## Einleitung

Wenn du diesem Blog gefolgt bist, könnte es dir aufgefallen sein, dass meine Haupt-Blogging-Plattform......" let' genannt wird.""enthusiastisch gestaltet"MSC5" PostgreSQL UND Vektordatenbanken , semantische und vollständige Textsuche mit GIN-Indizes..., automatisierte Übersetzung in "MSC9"-Sprachen., mehrere gehostete Dienste "MSSK11" Hangfire Job Scheduling" , Prometheus Metriken , Serilog tracing ," HTMX interactions , usign my own nuget packages , und genug Docker Container um ein Schiff eifersüchtig zu machen...MSC17

**Dass ,''s vollständig absichtlich ,.'** Diese Seite ist mein lebendes Labor, ein Spielplatz, wo ich mit Technologien experimentiere.,-Testeinsatzstrategien messen Leistungseigenschaften und wiederverwendbare Pakete erstellen *angenommen* zu sein über---engineered, weil dass ,' , wie ich lerne , durch die Lösung von Problemen, die die meisten Blogs Don , ' , nicht tatsächlich haben , um diese Lösungen als offene , - source Bibliotheken andere verwenden können ,

Aber hier ist das Ding **Sie wahrscheinlich nicht brauchen, dass eine von denen, um einen Blog zu führen.**

Das ist der Grund, warum ich **meistlucid-.-MinimalBlog** Um zu zeigen, was passiert, wenn man alle Experimente entfernt und sich auf das absolute Wesentliche konzentriert.... keine Datenbank... keine Pipeline bauen... keine Komplexität... nur Markdown-Dateien in einem Ordner, der im Web erscheint.

> ANMERKUNG: Siehe das Ende des Artikels für einen Link zur Quelle: ,. Ich plane auf die Freigabe dieses als [Nuget-Paket](https://www.nuget.org/packages?q=mostlylucid&includeComputedFrameworks=true&prerel=true&sortby=relevance) sobald ich Zeit bekomme, um sicherzustellen, dass es 's zuverlässig und es 's perf ist ,' , TOO schrecklich , ( , so suchen Sie für k , 6 , Test Artikel bald

[TOC]

## Weniger ist mehr

Das gesamte Projekt ist um ein Prinzip herum konzipiert. **Halten Sie es einfach**Keine Datenbank...... keine Bau-Pipeline.... kein JavaScript-Framework.... nur ASP.
HINWEIS:-Sie COULD tun sogar diese Client-Seite, indem Sie die Likes von [Markdown---it](https://github.com/markdown-it/markdown-it) dann haben Sie einfach die Server-Site Map statisch `.md` Dateien und machen es sogar SIMPLER, aber...

## Projektstruktur

Lassen Sie uns sehen, wie das Projekt organisiert wird

```
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
```

## Der Herz-Markdown-BlogService

Der Kern des Blogs ist die `MarkdownBlogService` Klasse: ., es ist bemerkenswert einfach -, nur Linien des Codes, die mit : umgehen

1. Markdown-Dateien aus einem Verzeichnis lesen
2. Metadaten parsing ](-title .,-Kategorien ?,-Veröffentlichungsdatum
3. Markdig in HTML konvertieren
4. Alles im Gedächtnis speichern

Hier ist ', wie es funktioniert.

### Beiträge werden geladen

Der Dienst scannt ein konfiguriertes Verzeichnis für `.md` Dateien und lädt sie alle in den Speicher

```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()!;
}
```

Beachten Sie die clevere Filterung `Count(c => c == '.') == 1` stellt sicher, dass wir nur Basis bekommen `.md` Dateien, die nicht übersetzte Versionen wie `post.ar.md` oder `post.de.md` Falls Sie Übersetzungen später hinzufügen möchten

### Analyse von Metadaten

Jede Markdown-Datei folgt einer einfachen Konvention.

```markdown
# Post Title

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

Your content here...
```

Der Parser extrahiert diese Metadaten mit regulären Ausdrücken und dem 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")
    };
}
```

### Caching-Strategie

Jede Methode im Service verwendet `IMemoryCache` um zu vermeiden, dass Dateien auf jeder Anfrage neu gelesen und wieder geparsiert werden

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

Cache-Einträge haben einen gleitenden Ablauf in Minuten und einen absoluten Ablauf in Stunden

## Programm-Einrichtung des Programms.cs

Das gesamte Programm-Setup ist nur 43-Linien, :, Razor Pages, ,, Memory Cache, MSC3, Ausgabecache, MSV4, zwei Singleton-Dienste,,, statische Datei mit , und einem MetaWeblog XML-, RPC-Endpunkt, MKS8, Alles wurde als Einzelton zwischengespeichert, da sich nichts ändert, es sei denn die Dateien werden geändert..

## Die einfachen Razor-Seiten

Die Benutzeroberfläche ist reiner Server.-.rendered HTML... Nein JavaScript.,.no HTMX.MSC3.no Alpine.....js...The homepage listet Beiträge auf. `@Html.Raw(post.HtmlContent)` mit einem `[OutputCache]` Attribut für Stunden--lang HTML Caching-.- vier Seiten gesamt,-jede unter Linien30-.

## Styling-:MSC1-Linien von CSS

Das gesamte visuelle Design wird durch eine einzige CSS-Datei mit nur behandelt.55 lines.Es verwendet CSS benutzerdefinierte Eigenschaften für die Themengestaltung und erzeugt einen sauberen, dunklen GitHub.MS K3 Inspired 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 ... */
```

Kein Vorprozessor, kein Build Step, keine Tausende von Dienstprogramm-Klassen, nur sauber und lesbar CSS, die funktioniert

## Bonus-Feature-MetaWeblog API

Für Autoren, die dedizierte Markdown-Editoren bevorzugen wie [Markierungsmonster](https://markdownmonster.west-wind.com/)Das Projekt enthält eine vollständige MetaWeblog API-Implementierung. Diese XML-API ermöglicht externe Editoren, um :...

- Liste der Stellen
- Neue Beiträge erstellen
- Bestehende Beiträge bearbeiten
- Stellen löschen
- Bilder hochladen
- Kategorien abrufen

Die Umsetzung ist in `MetaWeblogService.cs` und behandelt das komplette XML-Protokoll ,- ,RPC , , , um Anfragen zu analysieren und Antworten zu generieren Dies bedeutet, dass Sie Ihre Blogposts in Ihrem Lieblingseditor schreiben können und sie direkt in Ihrem Blog veröffentlichen können .. ,

## Einrichtung

Die gesamte Konfigurationsdatei ist nur für die Zeile :.

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

- `MarkdownPath` Wo Ihre Markdown-Dateien leben
- `ImagesPath` bei dem Bilder gespeichert werden
- `MetaWeblog` Anmeldeinformationen für externen Editor-Zugriff

## Als NuGet-Paket verwenden

> Wie oben erwähnt wird es SOON verfügbar sein, aber noch nicht

Der Blog ist jetzt als NuGet-Paket verfügbar., , so dass es trivial zu jedem ASP-. ,NET Core Anwendung hinzufügen.

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

Dann in Ihrem `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();
```

Dass es ' ist nur zwei Methode ruft MS K2`AddMinimalBlog` und `UseMinimalBlog`Und du hast einen funktionierenden Blog.

## Das Beispielprojekt ausführen

Um das mitgelieferte Beispielprojekt auszuführen

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

Besuch `http://localhost:5000` und Sie sehen den Blog mit Markdown-Dateien aus dem konfigurierten Pfad.

## Inhalt erstellen

So erstellen Sie einen neuen Blog-Post

1. Erstellen einer neuen `.md` Datei in Ihrem konfigurierten `MarkdownPath`
2. Fügen Sie die Standard-Metadaten hinzu
   ```markdown
   # Your Post Title
   
   <!-- category -- YourCategory, AnotherCategory -->
   <datetime class="hidden">2024-11-30T12:00</datetime>
   
   Your content here...
   ```
3. Datei speichern
4. Der Cache läuft innerhalb von Minuten ab.

Um Bilder hinzuzufügen, legen Sie sie einfach in Ihr konfiguriertes `ImagesPath` Verzeichnis und referenzieren Sie sie in Ihrem Markdown

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

## Was fehlt an (?

Dieses minimale Blog absichtlich doesn ́'.t enthalten

- **Bemerkungen** Verwenden Sie bei Bedarf einen Drittanbieter-Dienst
- **Suchen** Halten Sie Ihre Inhalte mit Kategorien organisiert
- **Stichworte** Kategorien sind ausreichend für kleine Blogs
- **RSS-/-Atom** Einfach hinzuzufügen, wenn Sie es brauchen
- **Authentifizierung** MetaWeblog API verwendet nur grundlegende Auth
- **Analyse** Snippet mit JavaScript hinzufügen, falls gewünscht
- **Optimierung der SEO** Funktioniert gut mit grundlegenden Meta-Tags
- **Reaktionsfähige Bilder** Browser behandelt es
- **Dark-/-Licht-Thema umschalten** Ein Thema ist genug

Diese Merkmale sind alle *möglich* um hinzuzufügen: ,, aber sie sind nicht standardmäßig enthalten, weil die meisten kleinen Blogs sie brauchen:

## Leistungsmerkmale

Trotz seiner Einfachheit ist dieser Blog **schnell**:

- **Speichercaching** bedeutet, keine Datei I/-O nach dem ersten Laden
- **Ausgabe-Caching** bedeutet keine Razor-Rendering nach erster Anfrage
- **Keine Datenbank** bedeutet keine Abfrage Overhead
- **Kein JavaScript** bedeutet schnelleres Laden der Seite
- **Einfaches CSS** bedeutet minimales Stylesheet Parsing

Für ein kleines bis mittleres Blog-Archiv unter 1000. posts.),. Diese Architektur wird die meisten Datenbanken übertreffen.-.backed blog platforms.

## Wann dieses vs.. , das vollständige Mostlylucid Blog verwenden

Verwendung **Meistlylucid-.-MinimalBlog** wenn ,:'

- Sie starten ein persönliches Blog
- Sie haben weniger als Posts
- Du brauchst mehrere Sprachen
- Sie wollen die Dinge einfach halten
- Sie sind komfortabel mit Markdown-Dateien
- Sie wollen nur schreiben und veröffentlichen

Verwenden Sie die **Volle Mostlylucid Plattform** wenn ,:'

- Sie verwenden Ihren Blog als **Lernlabor** für neue Technologien
- Sie wollen mit Einsatzstrategien experimentieren - Monitoring und Leistungsoptimierung
- Sie benötigen spezifische Funktionen wie mehrsprachige Unterstützung ., , voll ?- , Textsuche . , , Kommentare
- Sie bauen Pakete und benötigen ein echtes Testbed
- Sie dokumentieren komplexe technische Implementierungen
- Die Reise des Bauens der Plattform ist so wertvoll wie die Inhalte, die sie beherbergt

## Schlussfolgerung: Einfachheit als Merkmal

In der modernen Web-Entwicklungswelt erreichen wir häufig standardmäßig komplexe Lösungen.. Benötigen Sie einen Blog.?.Bessere Einrichtung einer Datenbank.,.Konfigurieren Sie eine ORM,,.Einrichten von Migrationen.,.Fügen Sie Caching hinzu.MSC6. Implementieren Sie die Suche.

Aber manchmal ist die einfache Lösung die *Recht* Lösung: .-Mostlylucid.-MinimalBlog beweist, dass Sie eine funktionale ,-fast-,- und aufbewahrbare Blog-Plattform mit : aufbauen können

- **Die Linien der Linie C.#** (-MarkdownBlogService MetaWeblogService +-Programm
- **Linien des Razor-Markups** Seiten
- **Zeilen von CSS**
- **Abhängigkeit von NuGet** (-Markdig-)-Markig

Dass **weniger als die Zeilen des Codes insgesamt** für eine komplette Blogging-Plattform

Das Projekt dient sowohl als funktionale Blog-Plattform als auch als Erinnerung, bevor Sie Komplexität hinzufügen – Fragen Sie sich selbst, ob Sie es wirklich brauchen – . Manchmal ist ein Ordner voller Markdown-Dateien alles, was Sie benötigen.

Den kompletten Quellcode finden Sie in der [Mostlylucid-.-MinimalBlog-Verzeichnis](https://github.com/scottgal/mostlylucidweb/tree/main/Mostlylucid.MinimalBlog) des Hauptrepositorys ,. , I' , das Nuget-Paket freigeben, sobald IM' ,m glücklich mit dem Code ,. ,

Fröhliches Bloggen – !