天天看點

Nancy之基于Self Hosting的補充小Demo

原文: 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去試試。
Nancy之基于Self Hosting的補充小Demo

有一千多顆心!不過這個貌似是老外用的比較多一點,中文的資料挺少的。

順便看看它的 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的引用

Nancy之基于Self Hosting的補充小Demo

目前它的最新版本是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之基于Self Hosting的補充小Demo

前面的Nancy之基于Nancy.Hosting.Self也是如此,但是忘記說明,在此深表歉意!!

下面是運作效果:

Nancy之基于Self Hosting的補充小Demo

正是我們所期待的。

然後再看看指令行視窗,會發現這些提示和我們在Program.cs設定的是相關的。設定的語句就是

x.SetXXXX()

五、還是老規矩,放linux下試試

将bin目錄下的檔案上傳到 /var/www/topshelf/

然後執行 mono TopShelfDemo.exe 即可

下面看看效果:

Nancy之基于Self Hosting的補充小Demo

貌似提示相比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     }      

我們這裡也隻是輸出一下文字!

六、運作試試

Nancy之基于Self Hosting的補充小Demo

正是我們所期待的結果!是不是很簡單呢!O(∩_∩)O

好了,關于Nancy Hosting的Demo暫時告一段落了,謝謝各位的支援!

後面會繼續深入學習Nancy,分享學習過程中的一些細節和心得體會。O(∩_∩)O

繼續閱讀