AServer 是基于 ASP.NET Core Kestrel 封装的一个超迷你 http 服务器. 它可以集成进你的 Core 程序里, 用来快速的响应 Http 请求, 而不需要集成整个 ASP.NET Core MVC 框架.
一: 什么是 ASever?
AServer 就像它的名字一样, Just a server, 它的功能非常简单, 它唯一的功能就是用来对 Http 请求做出响应. 以前我们开发一个. NET 程序, 比如控制台程序, Windows 服务等, 如果需要对外提供接口, 我们通常会在程序里集成 WCF, 使用 WCF 对外提供 RPC 接口. 但是现在是. NET Core 的时代, 我们已经没有办法选择 WCF 了. 而且这些需求往往很简单, 只是想要对外提供几个接口, 查询一些数据, 或者触发一些功能, 如果我们集成整个 ASP.NET Core MVC 框架又觉得是杀鸡用牛刀的感觉. 这个时候你或许可以选择 AServer.AServer 很简单, 它仅仅是一个 dll, 这或许正是你想要的.
GitHub 地址: https://github.com/kklldog/AServer 欢迎 star.
二: 使用 AServer
如何使用 AServer 呢, 非常简单, 让我们看几个示例代码就明白了. 假设我们现在有个跑定时任务的控制台程序, 这个程序需要对外提供 3 个 Http 接口:
1. 查询所有任务
2. 新增一个任务
3. 删除一个任务
下面演示如何使用 AServer 来实现这 3 个接口.
1. 新建一个 Core 的控制台程序
2. 从 nuget 安装 AServer
3. 实例化一个 Server
直接 new 一个 Server 对象, 它默认会监听本地 5000 端口.
- static void Main(string[] args)
- {
- var server = new Agile.AServer.Server();
- }
4. 实现查询所有任务接口
该接口的请求地址为 / API/tasks, 请求方法为 GET, 返回任务列表数组.
- server.AddHandler(new HttpHandler()
- {
- Method = "GET",
- Path = "/api/tasks",
- Handler = (req, resp) =>
- {
- return resp.Write("['Task1','Task2','Task3']");
- }
- });
5. 实现新增任务接口
该接口的请求地址为 / API/tasks, 请求方法为 POST, 如果新增成功则返回文本 "ok".
- // 新增任务
- server.AddHandler(new HttpHandler()
- {
- Method = "POST",
- Path = "/api/tasks",
- Handler = (req, resp) =>
- {
- var task = req.BodyContent;
- Console.WriteLine(task);
- return resp.Write("ok");
- }
- });
6. 实现删除任务接口
该接口的请求地址为 / API/tasks/:taskId, 请求方法为 DELETE, 如果删除成功则返回文本 "ok".
- // 删除任务
- server.AddHandler(new HttpHandler()
- {
- Method = "DELETE",
- Path = "/api/tasks/:taskId",
- Handler = (req, resp) =>
- {
- var taskId = req.Params.taskId;
- Console.WriteLine("delete"+taskId);
- return resp.Write("ok");
- }
- });
7. 启动服务器
调用 Server.Run() 方法启动服务器.
- // 启动服务器
- server.Run();
- Console.WriteLine("Task server is running now .");
- Console.Read();
8. 测试
至此, 演示代码编写完了. 运行这个控制台程序, 然后用 postman 来测试下这 3 个接口, 是否能响应我们预期的结果.
测试查询任务接口
测试新增任务接口
测试删除任务接口
可以看到我们对这 3 个接口的测试都返回了预期的值, 说明 AServer 正确的响应了我们的请求.
9. 通过继承 HttpHandlerController 实现接口
另外, 还可以通过继承 HttpHandlerController 来处理 http 请求. 该方法更接近 ASP.NET MVC 惯用的方法. 编写一个 class 继承自 HttpHandlerController, 对里面的方法添加 [HttpHandler] attribute 来指定请求地址跟方法. 需要注意的是里面的方法我们约定了签名: Task (Reqeust,Response).
下面的代码演示了如果通过继承 HttpHandlerController 来实现一系列汽车信息管理的 API 接口:
- public class ApiController : HttpHandlerController
- {
- public class car
- {
- public string id { get; set; }
- public string name { get; set; }
- }
- [HttpHandler("/api/cars", "GET")]
- public Task GetAllCars(Request req, Response resp)
- {
- List<car> cars = new List<car>();
- cars.Add(new car { name = "ae86" });
- cars.Add(new car { name = "911" });
- var JSON = JsonConvert.SerializeObject(cars);
- return resp.WriteJson(JSON);
- }
- [HttpHandler("/api/cars/:name", "GET")]
- public Task GetCar(Request req, Response resp)
- {
- var name = req.Params.name;
- List<car> cars = new List<car>();
- cars.Add(new car { id="001", name = "ae86" });
- cars.Add(new car { id="002",name = "911" });
- var car = cars.FirstOrDefault(c => c.name == name);
- if (car != null)
- {
- var JSON = JsonConvert.SerializeObject(car);
- return resp.WriteJson(JSON);
- }
- else
- {
- return resp.Write("NotFound", HttpStatusCode.NotFound, null);
- }
- }
- [HttpHandler("/api/cars","POST")]
- public Task AddCar(Request req, Response resp)
- {
- var car = req.Body<car>();
- //mock return id
- var JSON = JsonConvert.SerializeObject(car);
- return resp.WriteJson(JSON);
- }
- [HttpHandler("/api/cars/001", "PUT")]
- public Task UpdateCar(Request req, Response resp)
- {
- var car = req.Body<car>();
- //mock return id
- var JSON = JsonConvert.SerializeObject(car);
- return resp.WriteJson(JSON);
- }
- [HttpHandler("/api/cars/001","DELETE")]
- public Task DeleteCar(Request req, Response resp)
- {
- //delete car
- //...
- return resp.WriteJson("ok");
- }
- }
- ...
- // 加载 ApiController
- server.AddController<ApiController>();
- 10.Request/Response
通过上面的演示代码, 不难发现, AServer 对 Http 请求的处理都封装在 HttpHandler 对象中. HttpHandler 类有 3 个属性, Method,Path,Handler.Method 表示 Http 请求的方式, Path 表示请求的路径, Handler 是一个 Func, 业务逻辑就写在这里. Handler 的这个 Func 的方法签名为 Task (Request,Response).
其中 Request 封装了本次 Http 请求的请求部分的参数, 它会解析 Http 请求, 把 headers,queryStrings,params 解析成 dynamic 对象, 所以调用参数的时候跟写 JavaScript 类似, 如:
- var name = req.Params.name;
- var id = req.Query.id;
- var contentType = req.Header.contentType;
Response 则封装了几个 Write 方法, 用来写响应的内容, 状态码, Header 等内容, 如:
- resp.Write("ok");
- resp.Write("NotFound", HttpStatusCode.NotFound, null);
- var headers = new List<KeyValuePair<string, string>>();
- headers.Add(new KeyValuePair<string, string>("Content-Type", "charset=utf-8"));
- resp.Write($"user 001 be deleted .", HttpStatusCode.OK, headers);
- resp.WriteJson("{name:'kklldog'}");
三: 总结
对于 AServer 的介绍也差不多了. 希望对同学们有帮助. AServer 虽然功能很简单, 就是对 Http 请求做出响应. 但是我也可以说 AServer 的功能很强大, 因为它能对 Http 请求做出响应. 因为从 Http 的本质上来说, AServer 几乎可以实现所有基于 Http 的功能. 我们可以用它来实现 restful API, 可以用来实现各种管理系统, 可以用来实现 cms 系统...
不管使用 ASP.NET MVC 或者 JSP 或者 node express 等 web 框架开发 bs/Web 系统的时候其实套路都是一样的, 概况一下就这么几步:
1. 拦截请求 (路由)
2. 解析请求携带的参数 (url,headers,querystrings,body 等)
3. 根据参数处理业务 (查数据, 持久数据等)
4. 根据业务处理结果做出响应 (html,JSON,xml 等)
我们只要了解这个套路, 不管用什么技术, 什么框架, 其实都是一样的, 只要查下 API, 弄明白怎么获取 http 请求的参数, 怎么做出响应. AServer 也实现了这个套路. 如果有心的话, 对 AServer 实现过滤器, 参数绑定, 视图引擎等功能, 那基本上就是一个简易的 mvc 框架了. 当然如果你的业务复杂, 请选用 ASP.NET Core MVC, 它功能强大, 性能强悍; 如果你只是需要实现几个简单的 Http 接口, 可以考虑 AServer 来实现.
来源: https://www.cnblogs.com/kklldog/p/agileaerver.html