将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, , 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
将app接口服务器改为dotnet core承载的更多相关文章
- dotnet Core 调用HTTP接口,系统大量CLOSE_WAIT连接问题的分析,尚未解决。
环境: dotnet core 1.0.1 CentOS 7.2 今天在服务器巡检的时候,发现一个服务大量抛出异常 异常信息为: LockStatusPushError&&Messag ...
- 本地Docker Jenkins构建dotnet core web应用到Linux服务器 Docker上
1.准备工作 环境 本地: Windows.Docker 代码仓库:Git 服务器:Linux.Docker 前提准备 创建个有dockerfile文件的dotnet core 3 web项目 新建一 ...
- 用dotnet core 搭建web服务器(一)http server
环境说明 dotnet core,开发需要安装dotnetcore sdk,运行需要安装 dotnetcore runtime 运行目前几乎支持所有常见平台 开发推荐windows10 平台 首先安装 ...
- dotnet core 使用 sqlite 部署到 Centos 服务器
原文:dotnet core 使用 sqlite 部署到 Centos 服务器 本文告诉大家如何创建一个 asp dotnet core 程序,这个程序使用 sqlite 保存,部署程序到 Cento ...
- win10 uwp 使用 asp dotnet core 做图床服务器客户端
原文 win10 uwp 使用 asp dotnet core 做图床服务器客户端 本文告诉大家如何在 UWP 做客户端和 asp dotnet core 做服务器端来做一个图床工具 服务器端 从 ...
- vs2017 js cordova + dotnet core 开发app
原文:vs2017 js cordova + dotnet core 开发app 1.记得在index.html加入 <meta http-equiv="Content-Securit ...
- dotnet core swagger filter 隐藏接口和显示枚举描述
dotnet core 2.2开发项目中,常会使用Swagger UI来生成在线Api文档. 某些接口不想放到Swagger中可以这样写Filter: /// <summary> /// ...
- publish dotnet core angular spa app to docker
公司一个使用Angular开发的应用准备下个版本使用.Net Core开发后台, 刚好可以用到.Net Core Angular Spa模板, 而且最近也在学习Docker, 于是就想把它融汇贯通, ...
- 用dotnet core搭建web服务器(三)ORM访问数据库
访问传统sql数据库,大家以前都是用sql语句去查询.这些年流行orm方法 ORM是对象关系映射的简拼,就是用一个对象(class)去表示数据的一行,用对象的成员去表述数据的列 dotnet 官方很早 ...
随机推荐
- Python进阶-继承中的MRO与super
Python进阶-继承中的MRO与super 写在前面 如非特别说明,下文均基于Python3 摘要 本文讲述Python继承关系中如何通过super()调用"父类"方法,supe ...
- 日常API之百度翻译
百度翻译是什么,可以吃吗?相信很多人都熟悉,它是我们生活中必不可少的一只东东. 但是,百度翻译开发平台只有每月只能翻译200万个字符,多出的要按照49.00/百万字符来算.对于我酱紫的乞丐程序员来说, ...
- 2.如何安装vmvare tools
1.在主页点击虚拟机 重装vmvaretools,接着就会下载tar.gz包 2.cd 到解压包的地方,解压sudo tar zxf ... 3.解压之后会生成一个vmvare-toos-distri ...
- JAVA基础——编程练习(二)
JAVA编程练习(二) 今天我为了巩固之前的java基础知识的学习,再次进行实战演习,编写了一个小小的java控制台程序,主要是运用java面向对象的思想来完成这个小项目. 一.项目背景介绍 根据所学 ...
- 第二章(jQuery选择器)
2.1jQuery选择器是什么 1.CSS选择器 选择器 示例 选择器 示例 标签选择器 a{ } p{ } ul{ } ID选择器 #ID{ } 类选择器 .class{ } 群组选择器 td,p, ...
- js 、jq强化复习
JavaScript 显示数据 JavaScript 可以通过不同的方式来输出数据: 使用 window.alert() 弹出警告框. 使用 document.write() 方法将内容写到 HTML ...
- 使用hexdump工具追踪EXT4文件系统中的一个文件
昨天追踪EXT4文件系统的过程中出了点问题,就是找不到文件,于是试了一下追踪FAT32文件系统的,成功之后有了点信心,今天继续嗑EXT4文件系统,终于找到啦,记录一下. 操作系统:linux(cent ...
- Java 逆变与协变的名词说明
最近在研究Thinking in Java的时候,感觉逆变与协变有点绕,特意整理一下,方便后人.我参考于Java中的逆变与协变,但是该作者整理的稍微有点过于概念化,我在这里简单的说一下 我对于协变于逆 ...
- 【前端】用jQuery实现瀑布流效果
jQuery实现瀑布流效果 何为瀑布流: 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早 ...
- Sqoop Java API 导入应用案例
环境信息: Linux+JDK1.7 Sqoop 1.4.6-cdh5.5.2 hadoop-core 2.6.0-mr1-cdh5.5.2 hadoop-common 2.6.0-cdh5.5.2 ...