-
一、認識Nancy
今天聽講關於Nancy框架的培訓,被Nancy的易用性所吸引。故晚上回來梳理了一下知識。
什么是Nancy呢?如標題所述,Nancy是一個輕量級的獨立的框架:
Nancy 是一個輕量級用於構建基於 HTTP 的 Web 服務,基於 .NET 和 Mono 平台。
Nancy 設計用於處理 DELETE, GET, HEAD, OPTIONS, POST, PUT 和 PATCH 等請求方法,並提供簡單優雅的 DSL 以返回響應。
Nancy和Asp.net MVC原理相似,但有自己的一套路由機制,在使用上更加易用,可以用Nancy快速開發一些網站。Nancy官網
-
二、Nancy的引用
首先,新建一個Asp.net web應用程序:

建好工程后,點擊“引用”,右擊“管理Nuget工具包”,安裝Nancy相關文件,如下:

這是進行web開發時,安裝的三個主要文件,其中Viewengines.Razor相關於Asp.net MVC中的Razor視圖。
添加過引用后,發現會在Web.config里面生成如下配置:

從配置文件中可以看出,Nancy定義了自己的HttpHandlers類,所有的請求將交付給Nancy框架進行處理。至此Nancy的配置已經完成。下面開始進行Hello World之旅。
-
三、開始一個工程
Nancy配置好后,下面開始第一個應用程序:“Hello World”
首先Nancy也是有自己的規則的,Nancy工程中控制器的部分必須放在Modules文件夾中,視圖部分必須放在Views文件夾中,如圖:
HomeModule中添加代碼:
點擊運行,效果如下:
在ASP.NET MVC中所有控制器都繼承Controller,在Nancy中,同樣所有的‘控制器’都必須繼承NancyModule類。
注意,在Nancy中,所有的的路由信息都是在構造方法中的,當程序運行時,會遍歷所有所有的構造方法,如果出現路由信息相同時,默認選擇最后遍歷的那一個。
-
四、Nancy前后端交互(一)
1.Nancy是如何進行視圖先擇的呢?如果想顯示Home.cshtml頁面的信息,Nancy可以這樣寫:
1 public class HomeModule: NancyModule 2 { 3 public HomeModule() 4 { 5 Get["/"] = p => 6 { 7 return View["/Home"]; 8 }; 9 } 10 }

2.如果后端想返回數據給前端,又如何處理呢?我們可以這樣寫:
public class HomeModule: NancyModule { public HomeModule() { Get["/"] = p => { Person model = new Person() { Name="科比"}; return View["/Home", model]; }; } } public class Person { public string Name { get; set; } }
這樣就把數據拋磚到前端了,當然前端還需要設置好相關信息才能接收到Name信息,如下:

采用Razor引擎,接收Person對象數據,在顯示時,和MVC一樣,進行@Model.Name即可輸出信息,如下:

3.假如是ajax請求,需要返回Json,xml數據Nancy是怎么處理的呢?在Nancy中,實現了自己一套Response機制,Response下可以返回image,file,json等格式數據,很方便。在代碼中實現如下,就可以將后端數據拋磚到前端了:
public HomeModule() { Get["/"] = p => { Person model = new Person() { Name="科比"}; return Response.AsJson(new { result = true, message = "科比" });
//return Response.AsXml(model); }; }
4.在程序設計中,我們有時需要返回不同的對象,不同的數據到前端時,Nancy該怎么處理呢,能否滿足現有的需求呢?這里我們可以使用dynamic類型的數據。如下:
public class HomeModule: NancyModule { /// <summary> /// dynamic類型數據 /// </summary> private dynamic model = null; protected dynamic Model { get { if (model == null) { model = new ExpandoObject(); } return model; } set { model = value; } } //構造函數 public HomeModule() { Get["/"] = p => { Person per = new Person() { Name="科比"}; Happy hap = new Happy() { Nba="籃球" }; Model.person = per; Model.pappy = hap; return View["/home", model]; }; } } //實體 public class Person { public string Name { get; set; } } //實體 public class Happy { public string Nba { get; set; } }
同樣,我們需要在前端進行申明才可以引用,而因此時的數據是動態的(同ViewBag返回的數據類型一樣),所有沒有了智能提示:

注意:dynamic 和Model.XX要和后端傳遞的參數一樣。
-
五、Nancy前后端交互(二)
上面主要說了后端傳參數給前端,那前端是如何請求的呢?這里也做個說明。
1.我們經常傳個UserId,進行請求數據,那Nancy是如何獲取到的呢,如下:
如URL:http://localhost:62412/Index?Name=James
//構造函數 public HomeModule() { Get["/Index"] = p => { Person per = new Person(); per.Name=Request.Query["Name"];//get請求獲取方法 return View["/home", per]; }; }
效果如下:

2.請求實例2,如果請求的參數做為URL的一部分,怎么處理呢?如下:
URL:http://localhost:62412/Index/1
用{UserId}作占位符,p.UserId取得請求數據。
3.如果是大批量的請求數據怎么處理呢?
如學生信息注冊,需要提交學生學號和密碼,這時,我們可以這樣:
首先添加:using Nancy.ModelBinding;
其次綁定實體:Student s = this.Bind<Student>(); 即可獲取到所有的請求信息。代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Nancy; using System.Dynamic; using Nancy.ModelBinding; namespace NancyStudy.Modules { public class HomeModule: NancyModule { //構造函數 public HomeModule() { Post["/Index"] = p => { Student s = this.Bind<Student>(); return View["/home", s]; }; } } //實體 public class Student { public string Name { get; set; } public string Pwd { get; set; } } }
總結:至此,Nancy的常用功能已經總結的差不多了,如有興趣再會繼續研究Nancy代碼。~~~
