Nancy之基於Nancy.Owin的小Demo


前面做了基於Nancy.Hosting.Aspnet和Nancy.Hosting.Self的小Demo

今天我們來做個基於Nancy.Owin的小Demo

開始之前我們來說說什么是Owin和Katana

什么是Owin呢?

官網地址:http://owin.org

OWIN在.NET Web Servers與Web Application之間定義了一套標准接口,OWIN的目標是用於解耦Web Server和Web Application。

什么是Katana呢?

官網地址:http://katanaproject.codeplex.com/

一把銳利的武士刀。

比較詳細的介紹大家可以看看JustRun的文章:

下一代Asp.net開發規范OWIN(1)—— OWIN產生的背景以及簡單介紹

下一代Asp.net開發規范OWIN(2)—— Katana介紹以及使用

介紹這兩個不是今天的主題,所以下面就進入我們的正題了

一、新建一個空的asp.net程序

二、通過NuGet添加相關的程序集

Nancy.Owin,今天的主角。添加完這個后會自動添加Nancy

還有一個重要的角色是Microsoft.Owin.Host.SystemWeb,同時會自動添加依賴項:Owin和Microsoft.Owin

這個是通過Visual Studio 的Manage NuGet Packages來添加的,也可以在Package Manager Console輸入

  Install-Package Nancy.Owin

  Install-Package Microsoft.Owin.Host.SystemWeb

來完成添加。

三、添加OWIN Startup Class

我們在添加的Startup.cs中的Configuration中添加一下代碼,將Nancy交給Owin處理

1     public class Startup
2     {
3         public void Configuration(IAppBuilder app)
4         {           
5             app.UseNancy();
6         }
7     }

四、添加Modules文件夾用於存放我們的Modules

在Modules文件夾新建HomeModule.cs

1     public class HomeModule:NancyModule
2     {
3         public HomeModule()
4         {
5             Get["/"] = _ => "OwinDemo by Catcher Wong";
6         }
7     }

這里我們就顯示一下文字,后面部署會用之前的MovieDemo來完成。

ok,看看效果!

這個是符合我們預期結果的。

注:1)、由於演示這里用的 Microsoft.Owin.Host.SystemWeb是3.0.1版本的所以不需要做額外的處理,

    如果您的版本是1.x的話,請在web.config中添加如下配置

1 <appSettings>
2     <add key="owin:HandleAllRequests" value="true"/>
3 </appSettings>

    在新版本中簡化了我們的操作,可見還是很貼心的 O(∩_∩)O

   2)、如果您需要用到除了Get、Post之外的方法(Put、Head、Delete)還需要在system.webServer節點做相應的修改

1 <system.webServer>
2 <handlers>
3       <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
4       <remove name="OPTIONSVerbHandler" />
5       <remove name="TRACEVerbHandler" />
6       <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
7 </handlers>
8 </system.webServer>

五、多種運行調試方法,任君選擇

到這里,我們可以發現,我們運行和調試還是借助的IIS Express。
我們有沒有辦法不用IIS Express來運行和調試呢?
當然是有的!!!而且不止一種!!下面我們就分別來介紹一下!!

方式一:借助OwinHost.exe

可以參考 Glavs的這篇博客: Owin, Katana and getting started
通過啟動外部程序來實現!
在我們項目的屬性中的web選項卡中做如下的修改

就修改一下屬性即可。

再次運行,會發現啟動了一個OwinHost.exe的程序,然后我們打開瀏覽器去看看

效果是不是一樣啊,這就是第一種方式!

方式二:借助TinyFox(Jexus的姐妹)

這里我用的是TinyFox V2.3.2 跨平台通用版

下載地址: TinyFox V2.3.2 跨平台通用版 

具體要怎么做呢?讀讀解壓后的ReadMe.txt和看看里面附帶的demo也就大概知道個所以然了。

做法跟katana的方式類似,都是通過啟動外部程序來實現的。

但是區別還是有的。

我們需要添加一個Adapter.cs(這個我們可以在解壓后的TinyFox中的Demo里找到,修改一下namespace即可!)

 1 /**************************************************************************************
 2  *  ===              通過Microsoft.Owin.dll運行Nancy的應用示例                   ===
 3  * ==================================================================================
 4  * 目的:
 5  *   演示如果將 NancyFx 加入到 Microsoft.Owin 的處理環節中,然后利用Nancy建立web應用。
 6  * 使用方法:
 7  *   將編譯得到的dll連同Owin.dll、Microsoft.Owin.dll、Nancy.dll、Nancy.Owin.dll等文件
 8  *   一並放置到網站的bin文件夾中
 9  *************************************************************************************/
10 
11 
12 
13 #region <USINGs>
14 
15 using System;
16 using System.Collections.Generic;
17 using Microsoft.Owin.Builder;
18 using System.Threading.Tasks;
19 
20 #endregion
21 
22 
23 
24 namespace OwinDemo
25 {
26 
27     /// <summary>
28     /// 針對Microsoft.Owin的JWS開放接口適配器
29     /// <para>本接口適合兼容Microsoft.Owin規范的應用</para>
30     /// </summary>
31     class Adapter
32     {
33         static Func<IDictionary<string, object>, Task> _owinApp;
34 
35         /// <summary>
36         /// 默認構造函數
37         /// </summary>
38         public Adapter()
39         {
40             var builder = new AppBuilder();
41             var startup = new Startup();
42             startup.Configuration(builder);
43             _owinApp = builder.Build();
44 
45         }
46 
47 
48         /// <summary>
49         /// *** JWS所需要的關鍵函數 ***
50         /// <para>每個請求到來,JWS都會把請求打包成字典,調用這個函數</para>
51         /// </summary>
52         /// <param name="env">新請求的環境字典,具體內容參見OWIN標准</param>
53         /// <returns>返回一個正在運行或已經完成的任務</returns>
54         public Task OwinMain(IDictionary<string, object> env)
55         {
56             //如果為空
57             if (_owinApp == null) return null;
58 
59             //將請求交給Microsoft.Owin處理
60             return _owinApp(env);
61         }
62 
63 
64     } //end class
65 
66 
67 } //end namespace

做完這步,我們也是需要修改項目屬性的web選項卡內容

做完上述工作,看看效果

一樣的結果!!

六、部署到Linux下

前面也提到了,這里我們部署的是用之前的MovieDemo,這里是對其進行了修改,使其滿足我們今天的主題。

這次的部署是結合TinyFox這只小狐狸來完成的。由於篇幅有點長,所以修改的代碼不在這里展示,稍后會上傳到GitHub

這里列出項目結構和進行一些說明:

會發現比上面演示的案例多了幾個類:RazorConfig.cs和SiteRootPath.cs

其中

RazorConfig.cs是Razor的配置,因為我們這個Demo用到了Razor這個視圖引擎,如果沒用到可以不用這個。

SiteRootPath.cs是提供網站物理路徑的類

這兩個類我們都是能在TinyFox的Demo里面找到的!

現在我們將發布后的內容上傳到 /var/www/owinnancy

在 /var/www/ 下新建一個文件夾owinnancy : mkdir owinnancy

然后進入 tinyfox的目錄 cd /usr/tinyfox-2.3
執行./fox.sh -root  ar/www/owinnancy -p 8181 
已經啟動成功了,下面就是訪問看看OK否。打開瀏覽器訪問這個demo試試。順便放上幾張圖看看效果。 
 
 
 幾點必要的說明
1、宇內大大在ReadMe.txt中是這樣描述的(我只截取了部分內容)
   問:網站文件放哪兒?
      答:在TinyFox所在文件夾下的有一個名叫“site”的文件夾,這個文件夾中包括兩個子目錄,一個是wwwroot,
      用戶存放傳統的網站文件或靜態文件,另一個是approot,用於存放用戶的程序集及其相關依賴的dll,當然,
     dll文件也可以存放在wwwroot下的bin文件夾中;
  問:如果我的網站文件夾不在tinyfox默認的位置,怎么設定?
    答:在TinyFox.exe 后邊加上一個形如“-root 路徑”這樣的參數,如:“tinyfox -root d:\mysite\wwwroot”
 
   由於習慣問題,我是將網站放在 /var/www/下的某個文件夾,所以是采用了自定義路徑的形式。

2、次要說明,本來這篇是要在昨天發的,但因有事沒能及時發布!再說昨天是科比81分之夜的十周年,所以取8181端口紀念一下。O(∩_∩)O
 
 
2016.01.25重要補充:Linux部署結合Jexus
前面的部署是結合TinyFox來完成的,現在補充結合Jexus的方式部署的注意事項。
由於昨天嘗試在jexus部署時沒有成功,所以就沒往這個方面寫。剛才得到宇內大大的指點,已經把這個Demo(符合Owin標准)結合Jexus部署成功!
下面是他的原話
"不需要修改源碼,只需要在網站配置文件中,在OwinMain=xxx.dll 這一行,指定含有“適配器”的那個dll就行了。"
這個適配器指的是我們源碼中Adapter.cs,含有的那個dll自然就是MovieDemoWithOwin.dll
二話不說,我們試試
修改我們這個的網站的配置文件: vim /usr/jexus/siteconf/owinnancy
基本是保持默認的配置。具體的配置如下:
然后重啟我們的網站 /usr/jexus/./jws restart owinnancy
重啟OK!訪問試試
成功了!!
另外還要說一句,如果沒有加至關重要的那一句,訪問就是一片空白!
 
 
最后是部署所用的MovieDemo,其實跟之前的沒多少差別。
下載地址:
 
下一篇將會是對 Self Hosing 的一點點補充,敬請期待。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM