最近在研究如何將.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(); } } }
這段代碼的意思是指,要在本地機器上面的8888端口啟動一個NancyHost進行監聽,並且如果檢測到Mono運行環境的話,還要添加一些特的監聽信號的功能。
接下來我們需要添加一個具體處理清楚的模塊,NancyFx中的模塊就是一個最普通的class文件,只要繼承NancyModule就可以了。而且每個模塊可以注冊自己的路徑解析規則。
using Nancy; namespace ConsoleApplicationNancy { public class HelloModule:NancyModule { public HelloModule() { Get["/"] = parameters => "Hello,Nancy......"; } } }
現在就可以按下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這個應用,可以使用下面的方式














