Web服务器HttpServer(嵌入式设备)
HttpServer是一個輕量級Web服務器,用于在嵌入式設備以及客戶端環境中提供簡單Web服務。
HttpServer支持路由映射到匿名委托、WebApi接口、靜態文件,以及具有多個接口的控制器類。從簡單到復雜,控制權交給開發者。
源碼:https://github.com/NewLifeX/X/blob/master/NewLife.Core/Http/HttpServer.cs
Nuget:NewLife.Core
Get Started
準備好vs2022,新建.NET6.0控制臺項目
從nuget引用 NewLife.Core 包,找到包后點擊安裝,將會安裝最新版
打開源碼文件 Program.cs ,輸入以下例程,該例程將會監聽8080端口提供Web服務,并打開所有日志,映射了4個不同的路由。
using NewLife.Http; using NewLife.Log; using NewLife.Remoting;XTrace.UseConsole();var server = new HttpServer {Port = 8080,Log = XTrace.Log,SessionLog = XTrace.Log }; server.Map("/", () => "<h1>Hello NewLife!</h1></br> " + DateTime.Now.ToFullString() + "</br><img src=\"logos/leaf.png\" />"); server.Map("/user", (String act, Int32 uid) => new { code = 0, data = $"User.{act}({uid}) success!" }); server.MapStaticFiles("/logos", "images/"); server.MapController<ApiController>("/api"); server.Start();Console.ReadLine();點擊綠色三角箭頭啟動調試,或者按F5快捷鍵啟動
vs2022將會自動編譯源碼并啟動應用,彈出控制臺窗口
控制臺日志顯示,網絡應用程序已經開始監聽8080端口,分別在IPv4和IPv6上同時監聽。
通過瀏覽器訪問 http://localhost:8080/ ,可以得到以下頁面。
這是第一個路由映射的HTML頁面。(圖片文件沒有放到相應目錄下,所以沒顯示)
普通Html
HttpServer支持路由映射到一個返回html字符串的匿名方法
server.Map("/", () => "<h1>Hello NewLife!</h1></br> " + DateTime.Now.ToFullString() + "</br><img src=\"logos/leaf.png\" />");路由路徑為/,也就是根目錄。這個匿名函數很簡單,沒有參數(也可以有參數),返回字符串。服務端就認為返回的是html文本。
如果返回類型是Byte[]或者Stream等二進制數據,則使用 application/octet-stream 類型。
如果處理函數內部拋出異常,則服務端將向瀏覽器返回500錯誤。
Api接口
HttpServer支持路由到WebApi接口,支持從url截取參數,支持POST自定義Json格式參數。
server.Map("/user", (String act, Int32 uid) => new { code = 0, data = $"User.{act}({uid}) success!" });訪問地址 http://localhost:8080/user?act=edit&uid=1234 得到
路由路徑是/user。該接口返回一個對象,HttpServer將進行json序列化后返回。
靜態文件
HttpServer支持路由到靜態文件,可通過http訪問指定目錄下所有靜態文件。
server.MapStaticFiles("/logos", "images/");路由路徑是/logos,指向當前目錄的images子目錄下的文件。
例如前面html中訪問 /logos/leaf.png ,實際上指向 images/leaf.png ,需要在 images 子目錄下放置 leaf.png 文件。從 http://x.newlifex.com/leaf.png 下載圖片,放到images目錄下,當然也可以用自己的圖片。選中leaf.png文件,下方屬性窗的復制到輸出目錄,選擇“如果較新則復制”。
按F5再次跑起來項目,訪問 http://localhost:8080/ 。
從日志可以看到,請求根目錄/后,html里面img再次請求 /logos/leaf.png 圖片。
HttpServer僅支持常用文件類型的MineType。
注意:靜態文件處理器實現比較簡單,可以下載dll和config等任意文件,但路徑上做了限制,禁止跳出本地目錄。
接口控制器
HttpServer支持映射到控制器類,內部所有公開實例方法作為下級路由。
server.MapController<ApiController>("/api");路由路徑/api映射控制器ApiController下所有公開接口。該類下共有 All/Info/Info2 幾個接口。
訪問路徑 http://localhost:8080/api/info 可以看到:
本質上就是映射 /api/info 到 ApiController 內部的 Info 方法。
專用處理器IHttpHandler
HttpServer 對上述功能的支持,本質上就是把路由映射到 IHttpHandler 實現。因為完全可以通過自定義 IHttpHandler 實現來達到完全自定義Http處理的效果。
IHttpHandler 接口只有一個成員方法 ProcessRequest,傳入 IHttpContext 上下文。上下文中有Request請求和Response響應。
namespace NewLife.Http {//// 摘要:// Http處理器public interface IHttpHandler{//// 摘要:// 處理請求//// 參數:// context:void ProcessRequest(IHttpContext context);} }編寫一下例程:
context.Parameters中有解析好的Url參數,Response.SetResult設置響應數據和MineType類型。
然后在Programe.cs中增加映射
server.Map("/my", new MyHttpHandler());按F5啟動,訪問地址 http://localhost:8080/my?name=Stone 。
樹莓派跑起來
部署到樹莓派(這里不深入如何安裝.NET6.0)
然后 curl 跑起來
總結
以上是生活随笔為你收集整理的Web服务器HttpServer(嵌入式设备)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯,1000 亿!
- 下一篇: Blazor 应用如何使用 Azure