前言
一、
CSharp的web应用一般发布在IIS服务器上。要在Linux运行C#的web应用则是很麻烦。
一个应用如果关联类库和外界环境等因素太多,那么移植起来要做的事情和遇到的麻烦则越多。
NancyFx是一个出色的C#库,可以独立发布web服务器。官方是这样描述:
Nancy is a lightweight, low-ceremony, framework for building HTTP based services on .NET Framework/Core and Mono.
二、
NancyFx库早于 NetCore 之前发布,对 NetFramewok3.5和4 的支持是比较好的。对应同时期Linux最新版是 Mono4 。
后面 Framework4.5,NETCore,NET Standard版本,已经不断分裂,走向混乱,且互不兼容。Net5 说是大统一,天知道 MS会咋弄。
就像 Apple SwiftCode 那样,API 接口从来没有稳定过,每版本变一下。
同样的代码在两年后的新Framewok下编译,很可能就报废了。。。
微软收购Xamarin后,Mono 从 5.0起 也开始 逐渐迷失。。。
Android库 现在也有点混乱的迹像,至少现在还部分兼容着老API。一个SDK Manage解决代码兼容上的事,不需要这个SDK下载,那个Framework安装,前置条件一大堆框框。
故,原版库 用得越深,被坑得也越深。
尽管第三方库虽然在某些方面不如人意,但至少API不会变来变去。前几年累积下来的代码还能用,甚至以后的UOS也能用,对于 硬件配置,软件配置,系统运维复杂度,培圳新人 等节省成本资源 都是很有裨益,。
这里文字演示如何使用Nancy在Windows和Linux下发布web服务。
文字描述以精简的方式说明演示流程,如果你觉得相关概念和操作不太清晰,请自行搜索、学习。
[Windows运行]
1,Github下载Nancy源码 https://github.com/NancyFx/Nancy/releases 。 下载 1.x 版本。
2,解压后,使用 VisualStudio 打开 src 下的 sln ( Vs 2010 2013 2015 )
分别编译 Nancy ,Nancy.Hosting.Self,Nancy.ViewEngines.Razor 。或者直接“重新生成解决方案”。
(需要 net framework 4.0 )
把上面编译出来的 三个 dll 从各自目录的 bin/Debug 里面 提取出来,复制到桌面(或其它地方)。
3,VisualStudio 关闭 Nancy 解决方案。新建项目新建一个 TestNancyRazor 控制台工程。
把刚才上面编译出来的三个DLL:
Nancy.dll;Nancy.Hosting.Self.dll;Nancy.ViewEngines.Razor.dll;复制到项目目录下,并对其添加 引用。
4,把 Program.cs 改成如下代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Nancy.Hosting.Self;
namespace TestNancyRazor
{
class Program
{
static void Main(string[] args)
{
string url = "http://localhost:8888/";
HostConfiguration configuration = new HostConfiguration();
configuration.UrlReservations.CreateAutomatically = true;
using (var nancySelfHost = new NancyHost(configuration, new Uri(url)))
{
nancySelfHost.Start();
Console.WriteLine("NancySelfHost已启动。。");
try
{
Console.WriteLine("正在启动 " + url);
Console.WriteLine("成功启动 " + url);
}
catch (Exception)
{
}
//Linux下开启这行,注释下面两行
//while (true)System.Threading.Thread.Sleep(1000);
//Windows下开启这两行,注释上面那一行。
Console.Read();
nancySelfHost.Stop();
}
Console.WriteLine(url + " 已经停止 \n NancySelfHost已关闭。。");
}
}
}
5,新建 RoutePath.cs , 代码如下
namespace Nancy.Demo.Hosting.Self
{
using System.Linq;
public class RoutePath : NancyModule
{
public RoutePath()
{
Get["/{file}.cshtml"] = parameters =>
{
return View[(string)parameters.file];
};
/*
* 这样配置就可以模拟MVC,完全绕过了Nancy和Asp内置的MVC!
Get["/{action}"] = parameters =>
{
string action = (string)parameters.action;
if( action.IndexOf("jn") == 0 )
{
return Response.AsText("Json数据可以写成这样,在cshtml里可以直接写入HTML代码");
}
return View[(string)parameters.action];
}
*/
//更深入的路由,网搜:Nancy 路由
}
}
}
/*
静态资源访问,网搜: StaticContentConventionBuilder.AddDirectory
conventions.StaticContentsConventions.Add(StaticContentConventionBuilder.AddDirectory("statics"));
IRootPathProvider.GetRootPath() { return System.Environment.CurrentDirectory + "/"; }
*/
5,按F5编译,成功运行后,打开浏览器,定位 locahost:8888/ 即可看到效果页面。(curl http://localhost:8888/)
6,在 TestNancyRazor / bin / Debug / 下建个名为 Views 目录。 在 Views 下面建个 rz.cshtml 文件 ,代码如下
hello
@System.DateTime.Now.ToString()
7,浏览器访问( curl ) locahost:8888/rz.cshtml 即可看到效果
至此,Windows下编译Nancy运行Razor页面成功。
下面在Linux下编译Mono源码方式来运行。
[Linuw运行]
一、打Mono网站:http://download.mono-project.com/sources/mono/ ,下载源码并编译。( CentOS 6.8 )
# wget http://download.mono-project.com/sources/mono/mono-4.8.1.0.tar.bz2
# tar jxvf mono-4.8.1.0.tar.bz2
# cd mono-4.8.1.0
# yum -y install gcc gcc-c++ # 需要安装gcc
# ./configure --prefix=/usr/local
# make # 过程需15至30分钟
# make install
二、下载 NancyFx.tar.gz 源码包
# ## https://github.com/NancyFx/Nancy/releases/
# wget https://codeload.github.com/NancyFx/Nancy/ tar.gz/
# tar -zxvf xxx.tar.gz
# cd Nancy/src # 进入 Nancy/src 目录
### 编译 Nancy.dll
# cd Nancy
# xbuild Nancy.csproj
### 编译 Nancy.Hosting.Self.dll
# cd Nancy.Hosting.Self
# xbuild Nancy.Hosting.Self.csproj
### 编译 Nancy.ViewEngines.Razor.dll
# cd Nancy.ViewEngines.Razor
# xbuild Nancy.ViewEngines.Razor.csproj
Build succeeded.
0 Error(s)
编译完成,回到bash界面,若出现上面的 提示,表示编译成功。
(测试环境:VM CentOS 6.9 , ali yun repository)
三、把刚才上面在VisualStudio下创建的 TestNancyRazor 工程整个复制到 Linux 里面。(不需复制 bin/ 和 obj/ )
四、Linux 下定位到 TestNancyRazor 文件夹名称
把 刚才用 mono 编译成功的三个 dll : Nancy.dll;Nancy.Hosting.Self.dll;Nancy.ViewEngines.Razor.dll; 复制到 这个 TestNancyRazor 文件夹下,复盖掉原来的win下编译的dll
### 输入指令大概如下
# cd TestNancyRazor
# rm *.dll -f
# cp Nancy.三个.dll ./
按照Program.cs里面的注释,修改代码。
然后,编译 TestNancyRazor 工程
# xbuild TestNancyRazor.csproj
五、编译成功后
# cd bin/Debug
把刚才新建的 Views 目录及里面的文件也复制到 这个 Debug 目录下。
### 运行
### pwd = TestNancyRazor/bin/Debug/
# mono TestNancyRazor.exe # 加 & 后台运行,用kill指令关闭。
六、访问 locahost:8888/rz.cshtml 即可看到效果
# services iptables stop #禁用iptables后,局域网其它机器 可以通过打入 IP 访问,
附:
Apache 反向代理
ProxyPass /nc/ http://localhost:8888/
ProxyPassReverse /nc/ http://ip:8888/
Nginx 反向代理
location /nc {
proxy_pass http://127.0.0.1:8888;
}