在Linux中运行Nancy应用程序
最近在研究如何将.NET应用程序移植到非Windows操作系统中运行,逐渐会写一些文章出来。目前还没有太深的研究,所以这些文章大多主要是记录我的一些实验。
这篇文章记录了我如何利用NancyFx编写一个自托管(Self-host)的应用程序,并且将其发布到Linux系统中。
什么是NancyFx?
简单地说,这真是一个神奇的框架。它给自己的定义是:lightweigh web framework for .NET。不用不知道,一用吓一跳哈

与微软官方的ASP.NET MVC或者ASP.NET Web API这种框架来比较,它确实是轻量级的。简单易用,而且基于模块化的设计,也确实有些自己的 特点。它实现了OWIN,所以可以托管在IIS,或者其他任何的程序里面。
闲话少说,我们可以快速开发一个范例程序。
创建一个自托管的Web应用程序
我这里使用的是Visual Studio 2013,创建了一个最简单的Console Application,命令为 ConsoleApplicationNancy
添加两个包的引用
Install-Package Nancy.Hosting.Self
Install-Package Mono.Posix
在Program.cs文件的Main方法中添加如下代码
using Mono.Unix;
using Mono.Unix.Native;
using Nancy.Hosting.Self;
using System; namespace ConsoleApplicationNancy
{
class Program
{
static void Main(string[] args)
{
var uri = "http://localhost:8888";
Console.WriteLine("Nancy on :" + uri);
var host = new NancyHost(new Uri(uri));
host.Start(); if (Type.GetType("Mono.Runtime") != null)
{
UnixSignal.WaitAny(new[]{
new UnixSignal(Signum.SIGINT),
new UnixSignal(Signum.SIGTERM),
new UnixSignal(Signum.SIGQUIT),
new UnixSignal(Signum.SIGHUP)
});
}
else
{
Console.Read();
} Console.WriteLine("Stopping Nancy");
host.Stop();
}
}
}
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
这段代码的意思是指,要在本地机器上面的8888端口启动一个NancyHost进行监听,并且如果检测到Mono运行环境的话,还要添加一些特的监听信号的功能。
接下来我们需要添加一个具体处理清楚的模块,NancyFx中的模块就是一个最普通的class文件,只要继承NancyModule就可以了。而且每个模块可以注册自己的路径解析规则。
using Nancy; namespace ConsoleApplicationNancy
{
public class HelloModule:NancyModule
{
public HelloModule()
{
Get["/"] = parameters => "Hello,Nancy......";
}
}
}
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
现在就可以按下F5进行调试了。请注意,要将VisualStudio用管理员身份打开,因为这里涉及到了端口监听。


很神奇的,不是吗? 如果我们希望这个程序可以在非Windows操作系统(如Linux)中运行,是不是更有意思呢?
在Linux中运行Nancy应用程序
我这里做实验用的是Ubuntu 15.04 LTS。

为了在Linux中运行.NET的应用程序,目前需要首先安装Mono(很佩服这个项目组)。目前微软自己也在开发.NET Core,但还没有全部完成。
使用下面的命令可以很方便地安装mono(一句一句地执行)
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
sudo apt-get update
sudo apt-get install mono-complete
通过mono –V 可以查看当前安装的mono的版本

接下来就是要将我们编译好的程序上传到我的服务器上面去了
首先,我在服务器上面创建了一个目录 /var/www/nancydemo,并且分配了必要的权限(可写入,可执行)
然后通过winSCP这个工具,将编译结果上传到该目录


通过mono ConsoleApplicationNancy.exe 这样的指令就可以基于mono框架启动我们的应用程序了

然后,我们就可以通过以下的方式进行访问了

看起来确实很不错,不是吗?没想到.NET应用程序可以这么简单地迁移到Linux中来运行吧?这个得感谢mono。没想到网站可以这么容易编写吧?这个得好好研究Nancy啊
不过,这样启动应用程序有一个问题,就是只要我的控制台被关闭,那么网站也就关闭了。有没有什么办法让这个程序一直运行呢?

使用supervisor将这个程序一直在后台执行
首先,使用下面的命令安装supervisor
apt-get install supervisor
创建一个配置文件 /etc/supervisor/conf.d/nancydemo.conf
在文件中输入如下的内容,并保存
[program:nancydemo]
command=mono ConsoleApplicationNancy.exe -d
user=www-data
stderr_logfile = /var/log/supervisor/nancydemo-err.log
stdout_logfile = /var/log/supervisor/nancydemo-stdout.log
directory=/var/www/nancydemo/
然后,使用下面的命令切换到supervisor命令行

最后,启动nancydemo这个应用程序吧

这样的话,就算我们的控制台被关闭了,网站将一直在后台运行

如果什么时候想要停止nancydemo这个应用,可以使用下面的方式

在Linux中运行Nancy应用程序的更多相关文章
- 在windows系统下打包linux平台运行的go程序
在windows系统下打包linux平台运行的go程序 1.先在main.go下打包成.exe可执行程序测试代码是否正确 //cd到main.go目录 go build //打包命令 如果打包成功则表 ...
- Linux中运行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。
在Linux中运行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory. 分析:这是不同系统编码格式引起的:在windows系统中 ...
- vc++ 在程序中运行另一个程序的方法
在vc++ 程序中运行另一个程序的方法有三个: WinExec(),ShellExcute()和CreateProcess() 三个SDK函数: WinExec,ShellExecute ,Creat ...
- (原创)Windows下编译的Shell脚本不能再Linux中运行的解决办法
一.原理 Windows编译的文件和Linux编译的文件格式不太一样,导致在Linux运行Shell脚本的时候会提示:/bin/bash^M: bad interpreter: 没有那个文件或目录. ...
- linux中VI编写C程序。。。
在linux中编写C程序时不像编写shell那样开头要#!/bin/bash,但是在C程序中要指定头文件(头文件是指输入输出,宏等,而且要首先声明,也是必须要开始就声明的) 写好C代码后要给C文件赋予 ...
- call_usermodehelper内核中运行用户应用程序
init是用户空间第一个程序,在调用init前程序都运行在内核态,之后运行init时程序运行到用户态. 操作系统上,一些内核线程在内核态运行,它们永远不会进入用户态.它们也根本没有用户态的内存空间.它 ...
- 关于spring boot打出的jar包在Linux中运行
众所周知, spring boot打出的jar包可以通过 "java -jar xxx.jar"的方式来运行 但是在Linux中, 通过这个命令运行的话会占用该窗口, 当我们 Ct ...
- Linux后台运行和关闭程序、查看后台任务
fg.bg.jobs.&.ctrl+z 1.& (最经常被用到) 这个用在一个命令的最后,可以把这个命令放到后台执行 2.ctrl + z 可以将一个正在 ...
- 使用 SOS 对 Linux 中运行的 .NET Core 进行问题诊断
目录 说明 准备一个方便的学习环境 2.x 配置内容 3.x 配置内容 工具介绍 lldb sos plugin 1. attach 到进程上进行调试 2. 分析core dump文件 SOS 案例分 ...
随机推荐
- apache rewrite_mod 经典疑问解答
1.RewriteRule ^(com\/.*)$ index.php?do=$1 问:上面的规则匹配表达式 "^(.*)$" 匹配的内容是什么 答:匹配内容是URI站点目录:/d ...
- bootstarp3 支持ie8
http://blog.csdn.net/hyb3280660/article/details/51850832 想要bootstarp3 支持ie8? 引入 <!-- 存放全局css/js - ...
- AT指令调试程序
extern void Delay(__IO uint32_t nCount); USARType USART_SendStr(UART_HandleTypeDef * USART_Handler,c ...
- 浅析PHP中for与foreach两个循环结构遍历数组的区别
遍历一个数组是编程中最常见不过的了,这里跟大家讨论下for和foreach两种方法.用这两种方法执行遍历的场景太多太多了,这里我们只针对以下两个数组作为例子来讨论.所谓管中窥豹,多少能理清一点两者的区 ...
- openCV C++ 代码笔记
代码片段1 cv_contourMask_step_tmp=cv_contourMask.clone(); cv::Mat maskImage; UIImageToMat(pathimg, maskI ...
- C#实现DNS解析服务和智能DNS服务
C#实现DNS解析服务有一个开源项目ARSoft.Tools.Net, ARSoft.Tools.Net是一个非常强大的开源DNS控件库,包含.Net SPF validation, SenderID ...
- Android提权漏洞CVE-2014-7920&CVE-2014-7921分析
没羽@阿里移动安全,更多安全类技术干货,请访问阿里聚安全博客 这是Android mediaserver的提权漏洞,利用CVE-2014-7920和CVE-2014-7921实现提权,从0权限提到me ...
- 现代程序设计 网页前端开发作业(to 邹欣老师)
在一些著名的网站的搜索框上,会有一种“自动完成”功能. 比如google.百度和淘宝: 现在,我们来考虑如何实现这个功能. 第一步:模仿任意一个网站,编写一个类似的网页效果原型. 在这一步,不要估计开 ...
- 当MyEclipse突然异常关闭
今天的博文主要记录一个问题,就是当MyEclipse异常关闭后,再次开启环境,导致Tomcat无法启动的问题解决方案 问题描述:在MyEclipse启动或者是tomcat启动的时候出现:Address ...
- jieba中文分词的.NET版本:jieba.NET
简介 平时经常用Python写些小程序.在做文本分析相关的事情时免不了进行中文分词,于是就遇到了用Python实现的结巴中文分词.jieba使用起来非常简单,同时分词的结果也令人印象深刻,有兴趣的可以 ...