Nancy 框架学习
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中;