Nancy 框架
1、是一個輕量級用於構建http相應的web框架;
2、與mvc類似,有自己的路由機制;
3、可以處理 DELETE
, GET
, HEAD
, OPTIONS
, POST
, PUT
和 PATCH等請求;
4、完美支持OWIN(可以說他就是為OWIN而生的);
1、創建項目
打開vs,創建asp.net項目,選擇empty模板;
如圖
2、安裝模板
Package Manage Console,輸入命令
Install-Package Nancy
Install-Package Nancy.Owin
Install-Package Microsoft.Owin
解釋: 因為本篇實例是寄宿在TinyFox (國內牛人編寫的宿主容器,三平台通吃哦!!下載地址http://linuxdot.net/down/tinyfox-2.3.tar.gz),所以只需安裝這三個即可;
3、Owin相關配置
添加 Startup 方法新建項目選擇 OWIN Startup class
代碼如下
using System; using System.Threading.Tasks; using Microsoft.Owin; using Owin; [assembly: OwinStartup(typeof(NancyDemo.Startup))] namespace NancyDemo { public class Startup { public void Configuration(IAppBuilder app) { // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888 app.UseNancy();//增加Nancy 中間件到Owin管線; } } }
添加Adapter,將下面的代碼復制即可,我也是復制的!
public class Adapter { /************************************* * 這是一個比較完整的適配器示例 * ***********************************/ /// <summary> /// OWIN 應用程序委托 /// </summary> static Func<IDictionary<string, object>, Task> _owinApp; /// <summary> /// 適配器構造函數 /// </summary> public Adapter() { //實例化一個應用程序生成器 var builder = new AppBuilder(); // 為生成器添加一些參數 // 因某些OWIN框架需要從該參數中得到一些初始化環境信息 // 這些信息可以包括 如“owin版本”“服務器功”能等等 var properties = builder.Properties; properties["owin.Version"] = "1.0"; // 只能是1.0 var disposeSource = new CancellationTokenSource(); properties["server.OnDispose"] = disposeSource.Token; Func<Task> svrInitCallback = null; Action<Func<Task>> init = (callback) => { svrInitCallback = callback; }; properties["server.OnInit"] = init; //....... var capabilities = properties.ContainsKey("server.Capabilities") ? properties["server.Capabilities"] as IDictionary<string, object> : new Dictionary<string, object>(); properties["server.Capabilities"] = capabilities; capabilities["server.Name"] = "TinyFox"; //capabilities["websocket.Version"] = "1.0"; //...... //實例化用戶的啟動類,並調用配置方法 //如果用戶啟動類在其它的dll中,就需要通過反射找出這個類 var startup = new Startup(); startup.Configuration(builder); //構建OWIN應用並獲取該應用的代理(委托)方法 _owinApp = builder.Build(); //要求應用程序域退出時,向本類發出通知 AppDomain.CurrentDomain.DomainUnload += ((o, e) => { disposeSource.Cancel(); }); //回調應用層初始化函數 if (svrInitCallback != null) svrInitCallback().Wait(); } /// <summary> /// *** Jexus/TinyFox所需要的關鍵函數 *** /// </summary> /// <param name="env">新請求的環境字典,具體內容參見OWIN標准</param> /// <returns>返回一個正在運行或已經完成的任務</returns> public Task OwinMain(IDictionary<string, object> env) { //如果為空 if (_owinApp == null) return null; //調用Microsoft.Owin的應用程序委托函數,將請求傳給OWIN框架 return _owinApp(env); } } //end class
修改Nancy的根目錄設置 方法就是 增加下面的類即可 (直接復制吧)
using Nancy; using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace NancyDemo { public class SiteRootPath : IRootPathProvider { /************************************************************** * TinyFox Owin Server 默認情況下 * 網站是放在 TinyFox 進程所在文件夾下的site/wwwroot中的 * ---------------------------------------------------------- * 如果你把 NancyFx 的 Views 頁放在其它的地方,應該作相應修改 *******************************************************************/ /// <summary> /// 網站根文件夾物理路徑(for tinyfox) /// </summary> static readonly string _RootPath = AppDomain.CurrentDomain.GetData(".appPath").ToString(); /// <summary> /// 獲取網站或WEB應用的根文件夾的物理路徑 /// </summary> /// <returns></returns> public string GetRootPath() { return _RootPath; } } }
配置文件中增加如下配置
<appSettings> <add key="owin:HandleAllRequests" value="true"/> </appSettings>
為了方便調試,我需要對項目屬性進行設置,設置如下圖
4、開始coding
創建模塊(與mvc controller類似)
代碼如下
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Nancy; namespace NancyDemo { public class HomeModule : NancyModule//每個module必須繼承自NancyModule { public HomeModule() { Get["/"] = _ => { return Response.AsText("呵呵", "text/html;charset=UTF-8");//中文不亂碼了!! };//這里定義了訪問網站根目錄的route get 請求 } } }
到這里就可以簡單的運行了,F5!!
運行效果如下圖
到這里就簡單的搭建了一個Nancy站點,over!
補充:
Nancy owin模式寄宿在TinyFox 會存在web.config配置讀取不到的問題
解決方法就是 把web.config復制到TinyFox.exe相同目錄下 改成TinyFox.exe.config;
如果本身存在這個文件就直接把web.config中的內容復制到TinyFox.exe.config中;