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