将app接口服务器改为dotnet core承载

昨天我的一个 app 的接口服务器挂掉了,国外的小鸡意外的翻车,连同程序和数据一起,猝不及防。我的服务端程序是 asp.net mvc ,小鸡是 256 M 的内存跑不了 windows 系统,装的 mono 。服务器用的 jexus,但是还有一个 apache+php+mysql 的全家桶占用了 80 端口,所以这个接口是通过 apache 反向代理的。

这样一来本来环境就很复杂了,我 ubuntu 16.04 装 mono 下载了差不多700 mb 的数据,安装后体积更大,简直太不环保了,只有不到 10G 的硬盘。于是狠下心将服务器端程序重写,其它快餐语言我不会,据说 nodejs 和 python 会很快,部署也方便。但我还是用我的大 C#,好在现在有 dotnet core 了,也给大家安利一发,它是一个模块化的开发栈,也是未来的所有.NET平台的基础,横跨 Windows、Linux、OSX 三大主流系统。

因为我的接口比较简单,主要是输出 json 以及几个静态页面。所以不需要创建 web 项目,我并不想让他寄宿在服务器软件上运行,自己实现 Http 监听处理请求即可,不过这些 dotnet core 已经为你准备好了一个 Server.Kestrel,不需要自己造轮子。

关于 Server.Kestrel 可以参考这篇文章 ,更多的还是官方更详细,传送门 ,以及源码和示例:https://github.com/aspnet/KestrelHttpServer

在包管理控制台执行安装:

PM>  Install-Package Microsoft.AspNetCore.Server.Kestrel -Pre

另外,如果需要静态文件支持,还需要下面的库:

PM>  Install-Package Microsoft.AspNetCore.StaticFiles -Pre

使用很简单,在 Main 方法里实例化一个 WebHostBuilder 并调用 run 方法就可以,其他的都是配置。

var host = new WebHostBuilder()
    .UseKestrel()
    .UseUrls("http://*:5001")
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseStartup<Program>()
    .Build();
host.Run();

处理请求简直不要太简单:

app.Run(async (context) =>
{
    byte[] data = Encoding.UTF8.GetBytes("hello world");
    await context.Response.Body.WriteAsync(data, 0, data.Length).ConfigureAwait(false);
});

但是显然不够强大,无法处理 url 路由,接下来写一个抽象类处理 http 请求。

abstract class HandlerBase
{
    public abstract void Process(HttpContext context);
}

这里可以用一个 Dictionary<string,Handler> 保存路由:

_routes = new Dictionary<string, HandlerBase>();
_routes.Add("/home/hello", new Hello());
_routes.Add("/test/demo", new Demo());

Hello 这个类需要继承 HandlerBase 抽象类,重写 Process 方法:

class Hello : HandlerBase
{
    public async override void Process(HttpContext context)
    {
        byte[] data = Encoding.UTF8.GetBytes("hello world");
        await context.Response.Body.WriteAsync(data, 0, data.Length).ConfigureAwait(false);
    }
}

这样就避免了为了处理路由写一堆 if else,扩展性也比较好,根据 url 路径找到对应的 HandlerBase 的实现,并调用 Process 处理请求。

app.Run(async (context) =>
{
    HandlerBase handler = null;
    _routes.TryGetValue(context.Request.Path.ToString().ToLower(), out handler);
    if (handler != null) handler.Process(context);
    else
    {
        byte[] data = Encoding.UTF8.GetBytes("HTTP 404");
        await context.Response.Body.WriteAsync(data, 0, data.Length).ConfigureAwait(false);
    }
});

浏览器打开效果

然后就是静态文件的处理问题,建议放一个文件夹存放静态文件,比如创建 dotnet core web 程序时,会有一个 www 的文件夹。

Kestrel 处理静态内容也很简单:

app.UseStaticFiles(new StaticFileOptions()
{
    FileProvider = _fileProvider,
    RequestPath = ""

});

FileProvider 是必须是实现了 IFileProvider 的类。

IFileProvider _fileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "www"));

由于 RequestPath 是空字符串,这样一来只要访问 /abc.txt 就会直接映射到 www 目录下的 abc.txt 文件并原始返回。

发布项目后会产生一个 PublishOutput 文件夹,将里面的内容复制到主机 /home/test 目录中。要运行这个项目还需要在服务器安装 dotnet core ,这并不需要再原代码重新编译了,怎么安装可以参考官网

执行下面命令运行你的项目,如果你的项目叫 demo ??:

dotnet demo.dll

启动程序

最后的最后,如果想深入学习,不要只是执行个 Hello World,绝知此事要躬行!

时间: 2024-10-23 09:53:20

将app接口服务器改为dotnet core承载的相关文章

小蚂蚁学习APP接口开发(7)—— APP接口实例——服务器定时缓存的方式开发接口

基本的思路:服务器只负责定时更新缓存.请求进来只需要读取缓存就可以了. 服务器定时执行生成缓存的代码: <?php  /******************************** * *   crontab 定时生成缓存文件 * * * * * * /usr/bin/php /app/crontab.php *   学php的小蚂蚁 *   原创博客 http://my.oschina.net/woshixiaomayi/blog * ***************************

vs2017 js cordova + dotnet core 开发app

原文:vs2017 js cordova + dotnet core 开发app 1.记得在index.html加入 <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *;connect-src

publish dotnet core angular spa app to docker

公司一个使用Angular开发的应用准备下个版本使用.Net Core开发后台, 刚好可以用到.Net Core Angular Spa模板, 而且最近也在学习Docker, 于是就想把它融汇贯通, 之前往Docker上部署过.Net Core MVC的应用, 那个比较简单, 使用微软官方文档的示例即可. 于是在使用.Net Core Angular Spa的时候, 我依葫芦画瓢发现这是走不通的, 因为Angular应用在构建的时候除了依赖.Net Core SDK还依赖于Node, 直接使用原

【Step By Step】将Dotnet Core部署到Docker上

本教程的前提是,你已经在Linux服务器上已经成功的安装了Docker,我会大概介绍在此过程中用到的Docker命令,并不会介绍所有的Docker命令(因为我也不会). 一.在Docker中运行Dotnet Core Hello World 微软官方提供了已经集成好Dotnet Core运行所需环境的Docker Image,我们可以直接使用命令: docker run -it microsoft/dotnet:latest 其中 -i :表示以后台模式开始Docker Container -t

【ASP.NET Core分布式项目实战】(五)Docker制作dotnet core控制台程序镜像

Docker制作dotnet core控制台程序镜像 基于dotnet SDK 新建控制台程序 mkdir /home/console cd /home/console dotnet new console dotnet restore 创建 Dockerfile 文件,参考https://github.com/dotnet/dotnet-docker/blob/master/samples/aspnetapp/Dockerfile vim /home/console/Dockerfile #

通过Swashbukle给DotNet Core Web API 增加自动文档功能

DotNet Core Web API给开发者提供了一个很好的框架来开发Restful的API.那么这些API接口该如何管理起来呢?Swagger是一个很好的选择,Swagger不需要开发者额外去维护接口文档,只要开发者的接口遵循Restful的规范,Swagger就会根据API接口生成文档. 对于前后端分离的开发模式,前后端开发者一般会先定义好接口,然后各自独立开发,后端开发者可以使用Swagger很快的生成没有业务逻辑的接口文档,接口返回的是Mock Data,这样前端开发人员就可以更早的开

【一步一个脚印】Tomcat+MySQL为自己的APP打造服务器(3-1)Android 和 Service 的交互之GET方式

好久没更新了,罪过罪过.最对不起的人莫过于那些支持和等待在下拙文的诸位,在此道一声抱歉.管窥之见,侥幸博得各位认同,给了我莫大的鼓励. 话休絮烦,文接前章. 到[一步一个脚印]Tomcat+MySQL为自己的APP打造服务器(2-3)Servlet连接MySQL数据库为止,我们已经将服务端的部分走通了:通过 Servlet 连接 MySQL ,分析业务需求进行响应的增删改查操作返回对应的处理结果.(上一篇结尾是说接下来该说POST请求了,但是在准备这篇文章时发现POST再推后一篇,等我们把 An

APP接口版本兼容的问题

现在基本每个公司都做APP,所以大家都面临 APP接口版本兼容的问题. iOS和android 要不断开发新版本,很多服务端开发都是在以前接口的逻辑上进行修改.新的APP和接口开发后,接口如何兼容老的APP? 有的公司 每次发布完APP,就强制用户更新到最新版本.不推荐这样,因为用户体验太差. 就算是用 强制更新,在苹果审核期间,新的APP接口和 老的接口 也必须能同时使用. 下面我们说下如何做,我们用的是最后一种方式,大家有不同意见可以 留言讨论. 一.客户端 做兼容,接口不用做兼容 1.AP

边缘化搭建 DotNet Core 2.1 自动化发布和部署(下)

写在前面 本篇文章是上一篇边缘化搭建 DotNet Core 2.1 自动化发布和部署(上)的后续操作,本文主要讲解如何开启Docker Remote API,开启Remote API后的权限安全问题.配置Jenkins构建项目,并在云服务器上构建成功.废话不多说,我们一起来动手操作吧. 先决条件 1.一台Debain 9系统 x86 服务器 硬件环境:1核2G 40G硬盘. 2. x86服务器成功安装并运行Docker环境(本文不阐述安装过程,读者可查阅参考文献) 2.根据上一篇边缘化搭建 D