說到瀏覽器實時更新,多數.NET開發者第一時間想到的是WebSocket。但在很多監控面板、活動推送這類場景,其實有個更輕量的中間方案:用MongoDB 的變更流(Change Streams)捕獲數據庫變化,再通過服務器發送事件(Server-Sent Events,SSE)直接把數據推到前端。整個過程只需要極少的代碼,卻能換來穩定的單向數據流。
Kevin Smith 最近在技術博客里完整演示了這個組合。他的出發點很實際——不想為簡單的推送需求引入整套 SignalR,又不愿讓前端反復輪詢浪費資源。變更流加 SSE 的搭配恰好切中這個縫隙:數據庫有寫入就自動觸發生成事件,服務器收到后將其封裝成文本消息,沿著一條長連接源源不斷地送給瀏覽器。
![]()
什么是 SSE?它本質上是瀏覽器內置的 EventSource API,在一個 HTTP 連接上接收服務器推送的 UTF?8 文本流。與 WebSocket 不同,SSE 只做服務器到客戶端的單向通信,但換來了更簡單的實現:不用握手指令、不用維護雙向狀態,而且原生支持斷線自動重連。在 ASP.NET Core 的 Minimal API 中,只要返回 TypedResults.ServerSentEvents 就能拉起一個實時流,異常方便。
另一端的 MongoDB 變更流同樣值得一說。開發者不用每隔幾秒去查詢集合有沒有新數據,而是直接打開一個變更游標,訂閱目標集合或數據庫的插入、更新、刪除操作。MongoDB 會把每次變動變成一個事件推給應用,應用再將其映射成前端可消費的格式。對實時系統來說,這直接砍掉了輪詢帶來的大部分開銷和延遲。
Kevin 的 Demo 一步步展示了串聯過程:先用 dotnet new web 創建一個極簡的 ASP.NET Core 項目,引入 MongoDB.Driver 包;然后注冊 MongoClient、數據庫和訂單集合的單例服務;接著編寫一個 POST 端點負責寫入新訂單,以及一個 GET 端點返回 IAsyncEnumerable> 的流。當瀏覽器訪問這個 GET 地址時,EventSource 就會收到服務器不斷推送的訂單變更事件,頁面上對應的時間線或列表也隨之自動刷新。
這個方案當然有邊界。SSE 的單向特性讓它完美適配通知、活動日志和管理后臺,但一旦引入復雜雙向交互,還是應該切換到 SignalR。Kevin 也在文章中坦承了這些局限性,并給出了升級的判斷依據。對于大多數儀表盤類的需求來說,這種“變更流 + SSE”的組合已經足夠可靠,而且維護成本極低。
技術選型的樂趣正在于此:看懂每種工具的覆蓋范圍,然后用最少的膠水代碼把它們粘合起來。下次再遇到實時面板需求,不妨先試試這個輕量組合。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.