🎨二次开发
MicroServer二次开发指南
基于路由
这个示例的目标是:创建一个文件管理系统,支持列表查看、视频播放和文件下载。
C#版极简文件服务器
using MicroServer;
var MyAPI = new WebAPIServer();
string rootPath = @"D:\MyFiles"; // 设定你的物理资源根目录
// 1. 首页:列出所有文件 (简单 WebAPI)
MyAPI.AddRoute("/files", async (req, resp) => {
var files = Directory.GetFiles(rootPath).Select(Path.GetFileName);
var html = $$"""
<h1>文件清单</h1>
<ul>
{{string.Join("", files.Select(f => $"<li><a href='/view?name={f}'>{f}</a></li>"))}}
</ul>
""";
await resp.WriteAsync(html, WebAPIServer.ContentType.TextHtml);
}, "GET");
// 2. 查看/预览:支持视频拖动播放 (利用 asAttachment: false)
MyAPI.AddRoute("/view", (req, resp) => {
string fileName = req.ParseGetQueryString("name");
string fullPath = Path.Combine(rootPath, fileName);
// asAttachment: false 允许浏览器直接播放视频或预览图片
return resp.SendFileAsync(fullPath, asAttachment: false);
}, "GET");
// 3. 强制下载:(默认 asAttachment: true)
MyAPI.AddRoute("/download", (req, resp) => {
string fileName = req.ParseGetQueryString("name");
return resp.SendFileAsync(Path.Combine(rootPath, fileName));
}, "GET");
MyAPI.StartServer(8090);
Console.WriteLine("文件服务器已启动: http://127.0.0.1:8090");
VB.NET版极简文件服务器
' 首页路由:生成文件列表 HTML
MyAPI.AddRoute("/", Async Function(req, resp)
Dim files = Directory.GetFiles("D:\MyFiles").Select(Function(f) Path.GetFileName(f))
Dim html = <html>
<h1>文件管理中心</h1>
<ul>
<%= files.Select(Function(f) <li><a href=<%= "/view?name=" & f %>><%= f %></a></li>) %>
</ul>
</html>
Await resp.WriteAsync(html.ToString, WebAPIServer.ContentType.TextHtml)
End Function, "GET")
' 查看路由:利用 asAttachment:=False 实现视频播放器功能
MyAPI.AddRoute("/view", Function(req, resp)
Dim fileName = req.ParseGetQueryString("name")
Return resp.SendFileAsync("D:\MyFiles\" & fileName, False)
End Function, "GET")
基于中间件
这个示例演示了如何利用中间件的“终结者”特性,在一个逻辑块内完成路径匹配、方法分发和请求终结,从而灵活的自定义各种中间件。注意:中间件的执行是按添加顺序执行的
C#版本极简动态路由
using MicroServer;
using System.Text.RegularExpressions;
var MyAPI = new WebAPIServer();
// 【提示】前置鉴权/日志中间件应在此处注册
// 极简动态路由:建议作为最后的处理器
MyAPI.AddMiddleware(async (req, resp) => {
// 匹配 /product/123 这种带 ID 的路径
var match = Regex.Match(req.Url.AbsolutePath, @"^/product/(?<id>\d+)$");
if (match.Success) {
string id = match.Groups["id"].Value;
// 根据请求方式 (Method) 分发逻辑
switch (req.HttpMethod) {
case "GET":
await resp.WriteAsync($$"""{"action":"查询商品", "id":{{id}}}""");
break;
case "POST":
await resp.WriteAsync($$"""{"action":"更新商品", "id":{{id}}, "result":"Success"}""");
break;
default:
resp.StatusCode = 405;
await resp.WriteAsync("""{"msg":"不支持的操作"}""");
break;
}
return false; // 【核心】匹配成功并处理,返回 false 终结请求,不再走默认路由
}
return true; // 没匹配上,放行给后续逻辑或 404,如果是自定义路由建议放在最后,且只返回false,不再继续分发。
});
MyAPI.StartServer(8090);
VB.NET版极简动态路由
' 【提示】此处可按需添加前置拦截中间件
' 动态路由终结者
MyAPI.AddMiddleware(Async Function(req, resp)
Dim match = Regex.Match(req.Url.AbsolutePath, "^/product/(?<id>\d+)$")
If match.Success Then
Dim id = match.Groups("id").Value
' 业务分发处理
Select Case req.HttpMethod
Case "GET"
Await resp.WriteAsync(<t>{"msg":"查询", "id":<%= id %>}</t>.Value)
Case "POST"
Await resp.WriteAsync(<t>{"msg":"更新", "id":<%= id %>}</t>.Value)
End Select
Return False ' 处理完毕,不再继续分发
End If
Return True ' 没匹配上,继续走后续逻辑,如果是自定义路由建议放在最后,且只返回false,不再继续分发。
End Function)
🛠️集成开发建议
MicroServer 并非全家桶框架,而是一个高度开放、且开箱即用的逻辑骨架。我们建议你将 MicroServer 作为“胶水库” 进行二次封装集成到程序。
🔗扩展与“胶水”集成原则
- 数据序列化 (Data Binding) 本库仅负责字节流的传输。开发者通过集成第三方序列化器,在
Request接收与Response返回的节点上进行“逻辑粘合”,实现业务模型与 HTTP 载荷的按需转换。 - 文档工具集成 (API Documentation) 针对接口文档需求,建议开发者直接集成成熟的 Swagger 或 Docfx 等工具。由于 MicroServer 的路由触发逻辑较为灵活,建议通过手动配置 API 参数(Manual Configuration)的方式,将你的接口元数据与文档工具进行粘合,从而生成精准的交互式文档。
- 逻辑分层与中间件 (Middleware Encap) 利用语言的原生扩展能力(如扩展方法),将分散的中间件逻辑“胶粘”为语义化的功能模块。例如:将身份认证、日志审计、流量控制封装为
.AddAuth()等链式调用,使 MicroServer 演变为支撑特定业务的定制化框架。