原文: Nancy之基于Self Hosting的補充小Demo
前面把Hosting Nancy with ASP.NET、Self Hosting Nancy和Hosting Nancy with OWIN
以demo的形式簡單描述了一下。
這篇是為Self Hosting Nancy、和Owin 下面的Self Hosting作個補充。
首先是Self Hosting Nancy的補充:
這裡主要是介紹一下Topshelf
官網:
http://topshelf-project.com/ GitHub位址: https://github.com/Topshelf/Topshelf Topshelf是一個開源的跨平台的宿主服務架構,支援Windows和Mono,待會我們就把Demo放Linux去試試。![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuMzNzQWYyUTZxIGNhJmM0ITNykTYmFTO1gDNhRDOmJTYfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
有一千多顆心!不過這個貌似是老外用的比較多一點,中文的資料挺少的。
順便看看它的 readme.md
"Topshelf is a framework for hosting services written using the .NET framework. The creation of services is simplified,
allowing developers to create a simple console application that can be installed as a service using Topshelf. The reason
for this is simple: It is far easier to debug a console application than a service. And once the application is tested and
ready for production, Topshelf makes it easy to install the application as a service."
簡單的概括就是:簡單、一個控制台應用程式就可以當作是服務來用。
廢話不多說,直接看看它是如何搭配Nancy來用的
一、建立一個控制台應用程式
通過NuGet添加TopShelf的引用
目前它的最新版本是3.3.1。
當然也少不了添加Nancy和Nancy.Hosting.Self的引用
到這裡,基本工作已經完成了。
二、打開Program.cs,開始Coding
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 HostFactory.Run(x =>
6 {
7 x.Service<NancySelfHost>(s =>
8 {
9 s.ConstructUsing(name => new NancySelfHost());
10 s.WhenStarted(tc => tc.Start());
11 s.WhenStopped(tc => tc.Stop());
12 });
13 x.RunAsLocalSystem();
14 x.SetDescription("Sample Topshelf Host");
15 x.SetDisplayName("Catcher Wong");
16 x.SetServiceName("Nancy的Host");
17 });
18 }
19 }
x.Service<NancySelfHost>是告訴TopShelf,服務類型是NancySelfHost
s.ConstructUsing(name => new NancySelfHost()) 是告訴Topshelf如何建立這類服務,最直接的就是執行個體化,當然也可以用IoC來依賴注入
s.WhenStarted和WhenStopped應該比較明顯了,開始和停止
x.RunAsLocalSystem()表明用本地系統賬号來運作
這裡還有其他的RunAsxxx列出給大家參考
名稱 | 說明 |
RunAsPrompt | 當安裝了服務時,安裝程式将提示輸入使用者名/密碼組合用于啟動該服務。 |
RunAsLocalService | 使用本地服務帳戶運作 |
RunAsNetworkService | 使用 NETWORK_SERVICE 内置帳戶運作 |
看了大緻的解析,知道還需要自己定義一個服務類型NancySelfHost
1 public class NancySelfHost
2 {
3 private NancyHost _nancyHost;
4
5 public void Start()
6 {
7 const string uriStr = "http://localhost:8888/topshelf-nancy/";
8 _nancyHost = new NancyHost(new Uri(uriStr));
9 _nancyHost.Start();
10 try
11 {
12 System.Diagnostics.Process.Start(uriStr);
13 }
14 catch (Exception)
15 {
16 }
17
18 Console.WriteLine("監聽ing - " + uriStr);
19 }
20
21 public void Stop()
22 {
23 _nancyHost.Stop();
24 Console.WriteLine("下次再見!");
25 }
26 }
裡面的内容應該都比較熟悉了,就包含了開始和停止的方法,不再一一解釋了。
三、編寫我們的Modules
老規矩:Modules檔案夾、HomeModule.cs
1 public class HomeModule:NancyModule
2 {
3 public HomeModule()
4 {
5 Get["/"] = _ => "TopShelf by Catcher Wong";
6 }
7 }
四、運作調試一番,看看效果如何
這裡需要強調一點:需要用管理者的身份才能正常運作,否則會出現如下錯誤
前面的Nancy之基于Nancy.Hosting.Self也是如此,但是忘記說明,在此深表歉意!!
下面是運作效果:
正是我們所期待的。
然後再看看指令行視窗,會發現這些提示和我們在Program.cs設定的是相關的。設定的語句就是
x.SetXXXX()
五、還是老規矩,放linux下試試
将bin目錄下的檔案上傳到 /var/www/topshelf/
然後執行 mono TopShelfDemo.exe 即可
下面看看效果:
貌似提示相比windows多了一些東西,不過不影響我們的正常運作。
不知道各位是否發現這跟前面講的Nancy之基于Nancy.Hosting.Self的小Demo十分相似!!!
就連後面要講的基于Owin的Self Hosting也很相似,都是僅多了相應的操作方法!
好了,Topshelf就講到這裡了,不再進一步深入探讨了,如果您有更好的建議可以私聊我。O(∩_∩)O
下面簡單講講基于Owin的Self Hosting
前面也提到了,"Self Hosting" 這一類都是大同小異,十分相似。
下面就直接進入正題
一、建立控制台應用程式
二、添加相關的引用
直接通過Package Manager Console來添加
Install-Package Nancy.Owin
Install-Package Microsoft.Owin.Hosting
Install-Package Microsoft.Owin.Host.HttpListener
三、建立一個OWIN Startup class
我們在添加的Startup.cs中的Configuration中添加一下app.UseNancy(),将Nancy交由Owin去處理!
1 public class Startup
2 {
3 public void Configuration(IAppBuilder app)
4 {
5 app.UseNancy();
6 }
7 }
四、打開Program.cs,編寫代碼
記得要添加Microsoft.Owin.Hosting的引用
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 var url = "http://localhost:9000/";
6 using (WebApp.Start<Startup>(url))
7 {
8 Console.WriteLine("{0} 正在運作",url);
9 System.Diagnostics.Process.Start(url);
10 Console.Read();
11 }
12 }
13 }
WebApp是Microsoft.Owin.Hosting下面的一個類,WebApp.Start<Startup>(url)可了解為根據我們指定的url去啟動網站(從名字也能知道個大概)。
具體的可以參考msdn的介紹:
https://msdn.microsoft.com/en-us/library/microsoft.owin.hosting.webapp(v=vs.111).aspx五、編寫Modules
老規矩,Modules檔案夾,HomeModule.cs
1 public class HomeModule : NancyModule
2 {
3 public HomeModule()
4 {
5 Get["/"] = _ => "Owin Self Hosting Demo";
6 }
7 }
我們這裡也隻是輸出一下文字!
六、運作試試
正是我們所期待的結果!是不是很簡單呢!O(∩_∩)O
好了,關于Nancy Hosting的Demo暫時告一段落了,謝謝各位的支援!
後面會繼續深入學習Nancy,分享學習過程中的一些細節和心得體會。O(∩_∩)O