Back to "meistlucid ,. ,MinimalBlog , wie einfach kann ein ASP-. ,NET Blog wirklich Be , ? ,"

This is a viewer only at the moment see the article on how this works.

To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk

This is a preview from the server running through my markdig pipeline

ASP.NET Blogging Markdown

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

Monday, 01 December 2025

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

Weniger ist mehr

Das gesamte Projekt ist um ein Prinzip herum konzipiert. Halten Sie es einfachKeine Datenbank...... keine Bau-Pipeline.... kein JavaScript-Framework.... nur ASP. HINWEIS:-Sie COULD tun sogar diese Client-Seite, indem Sie die Likes von 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

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.

# Post Title




Your content here...

Der Parser extrahiert diese Metadaten mit regulären Ausdrücken und dem Markdig AST-:

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: 
    var categoryMatch = CategoryRegex().Match(markdown);
    var categories = categoryMatch.Success
        ? categoryMatch.Groups[1].Value.Split(',', StringSplitOptions.TrimEntries)
        : [];

    // Extract date: 
    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

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.

: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 MarkierungsmonsterDas 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 :.

{
  "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.

dotnet add package mostlylucid.MinimalBlog

Dann in Ihrem Program.cs:

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 K2AddMinimalBlog und UseMinimalBlogUnd du hast einen funktionierenden Blog.

Das Beispielprojekt ausführen

Um das mitgelieferte Beispielprojekt auszuführen

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
    # Your Post Title
    
    
    
    
    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

![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 des Hauptrepositorys ,. , I' , das Nuget-Paket freigeben, sobald IM' ,m glücklich mit dem Code ,. ,

Fröhliches Bloggen – !

logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.