引言
在博客网站的开发征程中,站长可谓是一路披荆斩棘。从最初的构思到实践,先后涉足了多种开发技术,包括 MVC、Razor Pages、Vue、Go、Blazor 等。在这漫长的过程中,网站版本更迭近 10 次,每一个版本都凝聚着站长的心血与探索,这段充满挑战的历程详细记录于 分享我做 Dotnet9 博客网站时积累的一些资料 - 码坊。
如今,經過深思熟慮與實踐檢驗,博客網站再次回歸 blazor,並採用了靜態 ssr 技術,同時融入了時尚且實用的 ant design 設計風格。這一系列的改進使得網站的訪問速度得到了質的飛躍,如同給網站注入了新的活力,目前網站已經成功上線。
- 網址:https://dotnet9.com

開源的力量
在此,要感謝以下開源項目:
- Known: https://known.org.cn/
這是一個開源企業級開發框架,基於 blazor 技術精心打造。它以低代碼、跨平台、開箱即用的卓越特性,打破了傳統開發的局限,真正實現了一處代碼,多處運行的高效模式。其核心價值在於高效與靈活,為軟體開發模式帶來了全新的變革,就像一把神奇的鑰匙,幫助開發者輕鬆開啟數位化轉型的大門,從容應對各種挑戰,助力業務實現蓬勃發展,開啟嶄新篇章。
本站源碼也是開源:
- 倉庫:https://github.com/dotnet9/CodeWF
碼坊是使用.net 9 blazor 開發的一個網站,這裡有技術文章,有開源項目居間,有在線工具使用: 碼坊-文章啟智,工具助力
網站技術
网站是基于 Known 的开源项目 KnownCMS 搭建:
knowncms 是基於 blazor 開發的一個內容管理系統,前台使用 blazor 靜態組件,後台使用 known 框架。
因为站长的网站只是一个博客文章展示、在线工具使用,平时文章编辑也是使用 Typora 及 VS Code 搭配使用,网站核心数据文件存储于 Assets.Dotnet9 仓库,所以站长去除了暂时不使用的后台管理相关功能,项目源码只有 3 个工程:

- antblazor:站長基本沒有改過該工程,基本是由 known 提供的 ant design 風格 blazor 靜態組件封裝,比如表單、標籤、按鈕之類的基本組件等。
- codewf:razor 類庫,主要實現網站文檔、博文頁面封裝,目前有工具還未上線,後面會按此庫架構另開一個庫寫在線工具;
- website:網站的入口工程,整合 codewf 和 antblazor 工程,當然也包括部分頁面封裝(首頁、關於、時間線等)、web api 控制器等
| AntBlazor | CodeWF | WebSite |
![]() |
![]() |
![]() |
小知識:什麼是靜態 ssr?
静态 SSR 与 Blazor Server 或 Blazor Client(WASM)有着显著的区别,微软文档 的说明:
靜態 ssr 是一種獨特的運行模式,在伺服器處理傳入 http 請求時,組件在伺服器端運行。在此過程中,blazor 會將組件巧妙地呈現為 html,並將其包含在響應內容之中。當響應發送完成後,伺服器端組件和相應的呈現器狀態會被自動丟棄,最終在瀏覽器端僅留存純淨的 html。
這種模式的優勢是多方面的。首先,它極大地降低了託管成本,為網站運營者減輕了經濟負擔。其次,它具有出色的可縮放性,無論是面對小規模的用戶訪問,還是大規模的流量衝擊,都能應對自如。這得益於它無需持續的伺服器資源來維持組件狀態,從而節省了大量伺服器資源。而且,它擺脫了瀏覽器和伺服器之間持續連接的束縛,同時也無需在瀏覽器中加載 webassembly,進一步優化了性能。
從更通俗易懂的角度來看,靜態 ssr 與 blazor server 同屬服務端渲染的範疇,但它在交互能力方面有所不同。在靜態 ssr 模式下,前端的 html 控制項不能像在 blazor server 中那樣使用 c# 事件方法映射,不過它仍然可以藉助 js 函數來實現交互,例如 button 的 click 事件可以映射 js 函數進行處理。值得慶幸的是,c# 實體綁定、服務注入等重要功能在靜態 ssr 中依然可以正常使用。這一特性使得靜態 ssr 成為需要 seo(搜尋引擎優化,即通過一系列技術手段提升網站在搜尋引擎中的排名,進而增加網站流量。其核心在於確保網站內容能夠被搜尋引擎有效抓取,從而獲得更多流量)的前台網站的理想選擇。以下是一個靜態 ssr 組件定義(文章詳情基本信息組件 upostcount.raozr):
@inject IOptions<SiteOption>
SiteOption
<div class="counts">
@if (Post?.Lastmod != null) {
<span>更新于@(Post?.Lastmod?.ToString("yyyy-MM-dd HH:mm:ss"))</span>
} else {
<span>创建于@(Post?.Date?.ToString("yyyy-MM-dd HH:mm:ss"))</span>
}
<span style="margin:0 5px;">|</span>
<span class="author"
>@(string.IsNullOrWhiteSpace(Post?.Author) ? SiteOption.Value.Owner :
Post!.Author)</span
>
@if (ShowEdit) {
<span style="margin:0 5px;">|</span>
<a
href="@ConstantUtil.GetPostGitHubPath(SiteOption.Value.RemoteAssetsRepository, Post)"
target="_blank"
>我要编辑、留言</a
>
}
</div>
@code { [Parameter] public BlogPost Post { get; set; } [Parameter] public bool
ShowEdit { get; set; } = true; }</SiteOption
>
效果如下:

網站功能說明
首頁
- 網址:https://dotnet9.com
和大多數網站一樣,先展示網站宣傳語 ”碼坊:使用.net 9 web api + blazor 開發。有技術文章、開源項目居間和在線工具,助力高效編程。“,然後展示特色文章塊,後面會加上特色工具塊(正在開發中),最後是友情連結、頁尾等:

文檔
這裡居間了站長部分開源項目:
- 網址:https://dotnet9.com/project

下面是部分項目簡介
- CodeWF
这是本站的源码仓库,可点击链接查看。
- CodeWF.EventBus
它适用于进程内事件传递(无其他外部依赖),功能与 MediatR 类似,可点击链接查看。
- CodeWF.EventBus.Socket
CodeWF.EventBus.Socket 是一个轻量级、基于 Socket 的分布式事件总线系统,旨在简化分布式架构中的事件通信。它允许进程之间通过发布 / 订阅模式进行通信,无需依赖外部消息队列服务。可点击链接查看。
- CodeWF.NetWeaver
CodeWF.NetWeaver 是一个简洁而强大的 C#库,支持 AOT,用于处理 TCP 和 UDP 数据包的组包和解包操作。可点击链接查看。
- CodeWF.Toolbox
CodeWF Toolbox 使用 Avalonia 开发的跨平台工具箱,使用了 Prism 作为模块化开发框架,支持 AOT 发布,可作为 Avalonia 项目学习。可点击链接查看。
- CodeWF.Tools
这里收集、分享了常用工具类,可点击链接查看。
- Assets.Dotnet9
这是本站的核心数据仓库,可点击链接查看。
博客
- 網址:https://dotnet9.com/post
博客頁面是標準的技術博客風格樣式,分為左、中、右三欄。左邊欄是文章分類列表,點擊可在中間分頁瀏覽文章列表,右側則是網站統計、站長推薦等內容:

点击列表中的文章可浏览文章详细内容,在此要感谢 VleaStwo (Lee) 大佬提供的 TOC 功能:这个功能使用户能够快速定位文章的重点内容,提高阅读效率。

所有文章您都可以修改
如果文章有錯別字、語病,或有誤導的地方,或您有什麼補充,可點擊頁頭右上角“我要編輯、留言”進行 pr,十分感謝!

最新一个对文章 . NET 跨平台客户端框架 - Avalonia UI 的 PR#4:

感谢网友 hjkl950217 (长空 X)
總結
在網站的開發歷程中,站長不斷探索嘗試,學習了大量的教程和開源項目,非常受用、非常感謝提供幫助的朋友和老師。
另外,VleaStwo大佬开了一个 Masa Blazor 分支,欢迎有兴趣的朋友前来 PR 或交流:

最後,貼上相關連結,大家可以了解、交流:
- 本站源碼(ant design 風格):https://github.com/dotnet9/codewf
- VleaStwo大佬分支(Masa Blazor 风格):https://github.com/VleaStwo/CodeWF
- Known:https://known.org.cn
- Ant Design Blazor:https://antblazor.com/
- Masa Blazor:https://masastack.com/blazor


