前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >AServer - 基于Asp.net core Kestrel的超迷你http服务器

AServer - 基于Asp.net core Kestrel的超迷你http服务器

作者头像
MJ.Zhou
发布于 2018-11-08 06:54:28
发布于 2018-11-08 06:54:28
91800
代码可运行
举报
文章被收录于专栏:.NET开发那点事.NET开发那点事
运行总次数:0
代码可运行

  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端口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      static void Main(string[] args)
        {
            var server  = new Agile.AServer.Server();
        }
  4.实现查询所有任务接口

  该接口的请求地址为/api/tasks,请求方法为GET,返回任务列表数组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
           server.AddHandler(new HttpHandler()
            {
                Method = "GET",
                Path = "/api/tasks",
                Handler = (req, resp) =>
                {
                    return resp.Write("['Task1','Task2','Task3']");
                }
            });
  5.实现新增任务接口

  该接口的请求地址为/api/tasks,请求方法为POST,如果新增成功则返回文本"ok"。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            //新增任务
            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"。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            //删除任务
            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()方法启动服务器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //启动服务器
            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接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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类似,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var name = req.Params.name;
var id = req.Query.id;
var contentType = req.Header.contentType;

Response则封装了几个Write方法,用来写响应的内容,状态码,Header等内容,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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来实现。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET MVC (五、HttpClient接口解析)
 选择【ASP.NET Web应用程序(.NET Framework)】项目,点击【下一步】
红目香薰
2022/11/29
1K0
ASP.NET MVC (五、HttpClient接口解析)
ASP.NET Core 框架本质学习
https://www.cnblogs.com/artech/p/inside-asp-net-core-framework.html
Vincent-yuan
2019/09/04
2.1K0
ASP.NET Core 框架本质学习
一不小心写了个WEB服务器
开场   Web服务器是啥玩意? 是那个托管了我的网站的机器么? No,虽然那个也是服务器,但是我们今天要说的Web服务器主要是指像IIS这样一类的,用于处理request并返回response的工具
用户1153966
2018/03/14
1.2K0
一不小心写了个WEB服务器
ASP.NET MVC (五、HttpClient接口解析)
选择【ASP.NET Web应用程序(.NET Framework)】项目,点击【下一步】
全栈程序员站长
2022/09/15
1.1K0
ASP.NET MVC (五、HttpClient接口解析)
《ASP.NET Core 微服务实战》-- 读书笔记(第4章)
我们将这些支持性服务称为后端服务,接下来我们将通过创建一个新的服务并修改之前的团队服务与这个服务通信,以探索如何创建并消费后端服务。
郑子铭
2021/01/13
6200
《ASP.NET Core 微服务实战》-- 读书笔记(第4章)
ASP.NET Web API 应用教程(一) ——数据流使用
相信已经有很多文章来介绍ASP.Net Web API 技术,本系列文章主要介绍如何使用数据流,HTTPS,以及可扩展的Web API 方面的技术,系列文章主要有三篇内容。 主要内容如下: I  数据流 II 使用HTTPS III 可扩展的Web API 文档 项目环境要求 VS 2012(SP4)及以上, .Net 框架4.5.1 Nuget包,可在packages.config 文件中查寻 本文涉及的知识点 ActionFilter AuthorizationFilter DelegateHand
葡萄城控件
2018/01/10
2.4K0
ASP.NET  Web API 应用教程(一) ——数据流使用
《ASP.NET Core 与 RESTful API 开发实战》-- (第9章)-- 读书笔记(下)
集成测试能够确保应用程序的组件正常工作,包括应用程序支持的基础结构,如数据库和文件系统等
郑子铭
2021/01/13
8030
《ASP.NET Core 与 RESTful API 开发实战》-- (第9章)-- 读书笔记(下)
ASP.NET Core快速入门(第4章:ASP.NET Core HTTP介绍)--学习笔记
课程链接:http://video.jessetalk.cn/course/explore
郑子铭
2021/01/13
7370
ASP.NET Core快速入门(第4章:ASP.NET Core HTTP介绍)--学习笔记
《ASP.NET Core 与 RESTful API 开发实战》-- (第7章)-- 读书笔记(上)
缓存是一种通过存储资源的备份,在请求时返回资源备份的技术。ASP.NET Core 支持多种形式的缓存,既支持基于 HTTP 的缓存,也支持内存缓存和分布式缓存,还提供响应缓存中间件
郑子铭
2021/01/13
6000
《ASP.NET Core 与 RESTful API 开发实战》-- (第7章)-- 读书笔记(上)
ASP.NET Core中使用Graylog记录日志
通常POST请求数据都在请求体中,ASP.NET Core中HttpRequest类型的Body属性是HttpRequestStream类型,该类型源码在Github上可以看到,但在Google和微软关方文档中都没搜索到。反编译Microsoft.AspNetCore.Server.Kestrel.Core.dll只找到了同样继承自ReadOnlyStream的FrameRequestStream
雪飞鸿
2019/02/25
1K0
《ASP.NET Core 微服务实战》-- 读书笔记(第3章)
微服务是一个支持特定业务场景的独立部署单元。它借助语义化版本管理、定义良好的 API 与其他后端服务交互。它的天然特点就是严格遵守单一职责原则。
郑子铭
2021/01/13
8880
《ASP.NET Core 微服务实战》-- 读书笔记(第3章)
ASP.NET Core 奇技淫巧之接口代理转发
要前后端分离~ 然因为种种原因..没办法用用纯前端的框架(其实是学习成本高,又没钱请前端开发人员)...
GuZhenYin
2020/08/13
5830
ASP.NET Core 奇技淫巧之接口代理转发
.net服务器端发起请求封装
写一个静态类封装类似客户端的请求 public static class HttpHelper { #region Get public static str
用户1055830
2018/05/28
9320
.net core 自定义规范响应的中间件
在本文中,我们将介绍如何使用 .NET Core 中的中间件来自定义规范响应,以便在 API 调用时返回统一的格式和错误信息。中间件是一种可以在请求和响应管道中执行逻辑的软件组件,它可以对请求或响应进行修改、拦截或处理。我们将使用一个简单的示例来演示如何创建和使用自定义规范响应的中间件。
郑子铭
2023/08/29
4900
.net core 自定义规范响应的中间件
200行代码,7个对象—让你了解ASP.NET Core框架的本质
当我们最开始学习一门技术的时候都喜欢从Hello World来时,貌似和我们本篇的主题不太搭。但事实却非如此,在我们看来如下这个Hello World是对ASP.NET Core框架本质最好的体现。
郑子铭
2023/08/30
7580
200行代码,7个对象—让你了解ASP.NET Core框架的本质
ASP.NET Core: 全新的ASP.NET !
背景 最新版本的 ASP.NET 叫做 ASP.NET Core (也被称为 ASP.NET 5)   它颠覆了过去的 ASP.NET。 什么是 ASP.NET Core? ASP.NET Core
葡萄城控件
2018/01/10
12K0
ASP.NET Core: 全新的ASP.NET !
.Net Core系列教程(五)—— Token Base身份认证
在ASP.Net Core中实现一个Token Base身份认证,使用场景主要就是Web API下,可以调用Web API的不止是浏览器,还有各种各样的客户端,有些客户端没有Cookies,也无法使用Session。这时候就需要Token来救场了,相比Cookies,Token更开放,而安全性也要比Cookies高很多。
徐大嘴
2019/03/21
4.6K0
.Net Core系列教程(五)—— Token Base身份认证
从头编写 asp.net core 2.0 web api 基础框架 (1)
工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相关知识就不介绍了, 这里主要是从头编写一个asp.net core 2.0 web api的基础框架. 我一直在关注asp.net core 和 angular 2/4, 并在用这对开发了一些比较小的项目. 现在我感觉是时候使用这两个技术去为企业开发大一点的项目了, 由于企业有时候需要SSO(单点登录), 所以
solenovex
2018/03/01
2.2K0
从头编写 asp.net core 2.0 web api 基础框架 (1)
在ASP.NET Core微服务架构下使用RabbitMQ如何实现CQRS模式
在现代软件开发中,微服务架构和CQRS模式都是备受关注的技术趋势。微服务架构通过将应用程序拆分为一系列小型、自治的服务,提供了更好的可伸缩性和灵活性。而CQRS模式则通过将读操作和写操作分离,优化了系统的性能和可维护性。本文小编将为大家介绍如何在ASP.NET Core微服务架构下使用RabbitMQ来实现CQRS模式。
葡萄城控件
2024/01/10
3350
在ASP.NET Core微服务架构下使用RabbitMQ如何实现CQRS模式
ASP.NET Core的Kestrel服务器
原文地址----Kestrel server for ASP.NET Core By Tom Dykstra, Chris Ross, and Stephen Halter Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器,libuv是一个跨平台的异步I/O库。ASP.NET Core模板项目使用Kestrel作为默认的web服务器。 Kestrel支持以下功能: HTTPS 用于启用不透明升级的WebSockets 位于Nginx之后的高性能Unix sockets Kes
潘成涛
2018/01/18
5.2K0
ASP.NET Core的Kestrel服务器
推荐阅读
相关推荐
ASP.NET MVC (五、HttpClient接口解析)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档