AServer - 基于Asp.net core Kestrel的超迷你http服务器
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来实现。
AServer - 基于Asp.net core Kestrel的超迷你http服务器的更多相关文章
- 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(1)
最近使用vscode比较多. 学习了一下如何在mac上使用vscode开发asp.netcore项目. 这里是我写的关于vscode的一篇文章: https://www.cnblogs.com/cgz ...
- 如何基于asp.net core的Identity框架在mysql上作身份验证处理
首先了解这个概念,我一开始也是理解和掌握基本的概念,再去做程序的开发.Identity框架是微软自己提供,基于.net core平台,可拓展.轻量 级.面向多个数据库的身份验证框架.IdentityS ...
- 基于Asp.Net Core的简单社区项目源代码开源
2019年3月27号 更新版本 本项目基于 ASP.NET CORE 3.0+EF CORE 3.0开发 使用vs2019 +sqlserver 2017(数据库脚本最低支持sql server 20 ...
- 基于ASP.NET Core 创建 Web API
使用 Visual Studio 创建项目. 文件->新建->项目,选择创建 ASP.NET Core Web 应用程序. 基于 ASP.NET Core 2.0 ,选择API,身份验证选 ...
- 基于ASP.Net Core开发的一套通用后台框架
基于ASP.Net Core开发一套通用后台框架 写在前面 这是本人在学习的过程中搭建学习的框架,如果对你有所帮助那再好不过.如果您有发现错误,请告知我,我会第一时间修改. 知其然,知其所以然,并非重 ...
- 基于ASP.NET Core 3.0快速搭建Razor Pages Web应用
前言 虽然说学习新的开发框架是一项巨大的投资,但是作为一个开发人员,不断学习新的技术并快速上手是我们应该掌握的技能,甚至是一个.NET Framework开发人员,学习.NET Core 新框架可以更 ...
- [译]基于ASP.NET Core 3.0的ABP v0.21已发布
基于ASP.NET Core 3.0的ABP v0.21已发布 在微软发布仅仅一个小时后, 基于ASP.NET Core 3.0的ABP v0.21也紧跟着发布了. v0.21没有新功能.它只是升级到 ...
- 基于Asp.Net Core,利用ZXing来生成二维码的一般流程
本文主要介绍如何在.net环境下,基于Asp.Net Core,利用ZXing来生成二维码的一般操作.对二维码工作原理了解,详情见:https://blog.csdn.net/weixin_36191 ...
- 基于ASP.NET core的MVC站点开发笔记 0x01
基于ASP.NET core的MVC站点开发笔记 0x01 我的环境 OS type:mac Software:vscode Dotnet core version:2.0/3.1 dotnet sd ...
随机推荐
- 企业级NFS网络文件共享服务_【all】
1.1. 什么是NFS(1台机器提供服务) Network File System(网络文件系统)通过局域网让不同的主机系统之间共享文件或目录. NFS客户端可以通过挂载的方式将NFS服务器端共享的数 ...
- Exchange & Office 365最小混合部署
前言 这篇文章的主题是混合部署~ 混合使得本地组织和云环境像一个单一的.协作紧密的组织一样运作.当组织决定进行混合部署,达到本地Exchange Server和Office 365共存的状态时,就会面 ...
- Error 'LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or cor
转自:http://blog.csdn.net/junjiehe/article/details/16888197 采用红字方法可行,后来采用cmake生成sln文件时,又出现了该问题,采用了玫红色字 ...
- firewalld防火墙简单理解总结(一)
参考文章:https://linux.cn/article-8098-1.html https://linux.cn/article-9073-1.html #多区域使用示例,重点参考 前言 防火 ...
- 加速安装 Sharepoint 2013 SP1
第一次安装把人吓了一跳,居然花了5个半小时.想想有一大堆服务器要升级,不得不想想有什么加速的办法. 试了好几种方法,以下的办法最为简单 1:停止 IIS ADMIN,WWW 服务 2:停止所有 sha ...
- SQL触发器与CLR的使用
在数据库的日常操作中,面对复杂业务的情况下,总会有用sql语句或存储过程不是那么方便的时候,所以这时候就会想到在数据库中调用CLR,也就是调用程序集,此处用C#实现来讲解一个测试案例 测试案例的业务是 ...
- 自定义input[type="checkbox"]的样式
对复选框自定义样式,我们以前一直用的脚本来实现,不过现在可以使用新的伪类 :checkbox 来实现. 如果直接对复选框设置样式,那么这个伪类并不实用,因为没有多少样式能够对复选框起作用.不过,倒是可 ...
- 【从源代码看Android】02MessageQueue的epoll原型
版权声明:本文为博主原创文章,欢迎转载.请注明原文链接 https://blog.csdn.net/ashqal/article/details/31772697 1 开头 上一讲讲到Looper,大 ...
- 4518: [Sdoi2016]征途
Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...
- PAT乙级1009
1009 说反话 (20 分) 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串.字符串由若干单词和若干 ...