.NET Nancy 详解(一) 初识
Nancy 是一个轻量级的,简单粗暴的framework用来构建基于HTTP的各种服务,兼容.Net和Mono。Nancy的整套设计理念是基于"super-duper-happy-path",这是一个作者杜撰的单词,个人觉得翻译过来基本就是简单粗暴,行之有效的意思。
简单的例子:
public class Module : NancyModule
{
public Module()
{
Get["/greet/{name}"] = x => {
return string.Concat("Hello ", x.name);
};
}
}
github上的例子后面跟着的是Compile, run and enjoy the simple, elegant design!,这句话让我深深的感受到这群程序员的可爱。
Features
- 自底向上全套都是新构建的,移除了对其他框架的引用和限制。
- Run anywhere. Nancy 能够在ASP.NET/IIS,OWIN,Self-hosting中运行。
- 集成支持各种View engine(Razor, Spark, dotLiquid, SuperSimpleViewEngine...)
- 一个强力而且轻量级的测试框架。
- 内容协商。
- And much, much more
如果本文就这样结束了,那和其他介绍的文字就没有多大的区别了。让我们坐上github的时光机,开始我们的扒皮之旅。
第一站:version-20101128

这个时候的Nancy 就如同一个刚出生的婴儿,也正因为如此,才便于我们入手。入口点当然是大家耳熟能详的IHttpHandler。这里的IsReusable可是false的,有一定的性能损失,这里的知识点大家可以参见另外的博文。
public class NancyHttpRequestHandler : IHttpHandler
{
public bool IsReusable
{
get { return false; }
}
public void ProcessRequest(HttpContext context)
{
//...
}
}
既然刚出生,自然问题很多,就如同下面的代码,这里本着不吐槽的原则,只是笑而不语,恩恩。
public void ProcessRequest(HttpContext context)
{
var url = context.Request.Url.AbsolutePath;
if (url.Contains("favicon.ico"))
{
return;
}
var request = CreateNancyRequest(context);
var assembly =
context.ApplicationInstance.GetType().BaseType.Assembly;
var engine =
new NancyEngine(new NancyModuleLocator(assembly), new RouteResolver());
var response = engine.HandleRequest(request);
SetNancyResponseToHttpResponse(context, response);
}
值得赞赏的是单元测试一开始就跟上了项目进度,这样方便我们去研究其代码的意图。其中比较有意思的是Response类的实现,里面使用了隐式的类型转换,用来实现无论是HttpStatusCode还是Content都直接用=赋值即可,当然这么做会带来一定的副作用。
public void Should_set_status_code_when_implicitly_cast_from_int()
{
// Given, When
Response response = 200;
// Then
response.StatusCode.ShouldEqual(HttpStatusCode.OK);
}
public void Should_set_status_code_when_implicitly_cast_from_http_status_code()
{
// Given, When
Response response = HttpStatusCode.NotFound;
// Then
response.StatusCode.ShouldEqual(HttpStatusCode.NotFound);
}
public void Should_return_contents_when_implicitly_cast_to_string()
{
// Given
const string value = "test value";
Response response = value;
// When
String output = response;
// Then
output.ShouldEqual(value);
}
具体的隐式转换倒是没啥内容。
public static implicit operator Response(HttpStatusCode statusCode)
{
return new Response { StatusCode = statusCode };
}
public static implicit operator Response(int statusCode)
{
return new Response { StatusCode = (HttpStatusCode)statusCode };
}
public static implicit operator Response(string contents)
{
return new Response { Contents = contents, ContentType = "text/html", StatusCode = HttpStatusCode.OK };
}
public static implicit operator string(Response response)
{
return response.Contents;
}
Request
对于Request 的包装暂时只是占了个坑,后续版本有补充cookie的一些操作在这里。
public interface IRequest
{
string Path { get; }
string Verb { get; }
}
public class Request : IRequest
{
public Request(string verb, string path)
{
this.Path = path;
this.Verb = verb;
}
public string Path { get; private set; }
public string Verb { get; private set; }
}
つづく
.NET Nancy 详解(一) 初识的更多相关文章
- .NET Nancy 详解(三) Respone 和 ViewEngine
我们在ASP.NET MVC中可以返回各种类型的ActionResult(以下图片来自于园友--待补..) 在Nancy 中本着简单粗暴的原则,使用方式略有不同.这期我们使用的版本是Nancy的第一个 ...
- .NET Nancy 详解(四) Self Host
Self Host 使得Nancy 能够在任意application 中启动,无论是console 还是windows service.这期我们使用的版本是Nancy v0.4.0. Demo 首先看 ...
- .NET Nancy 详解(二) 简易路由实现
继续上面的简易版本,有意思的点剩下便是路由实现了. 路由注册 首先,来看一下基本的路由注册过程. public FakeNancyModuleWithoutBasePath() { Delete[&q ...
- RxJava2.0的使用详解
RxJava2.0的使用详解 1,初识RxJava RxJava就是一种用Java语言实现的响应式编程,来创建基于事件的异步程序 RxJava是一个基于事件订阅的异步执行的一个类库,目前比较火的一些技 ...
- web标准 浏览器介绍 开发工具介绍 HTML介绍 HTML颜色介绍 规范 HTML结构详解 {前端之前端初识}
前端之前端初识 前端初识 本节目录 一 web标准 二 浏览器介绍 三 开发工具介绍 四 HTML介绍 五 HTML颜色介绍 六 规范 七 HTML结构详解 一 web标准 web准备介绍: 1. ...
- MYSQL之数据库初识、安装详解、sql语句基本操作
目录 MYSQL之数据库初识及安装详解 1.什么是数据库? 1.什么是数据?(data) 2.什么是数据库?(databases,简称DB) 2.为什要用数据库? 3.什么是数据库管理系统?(Data ...
- NopCommerce源码架构详解--初识高性能的开源商城系统cms
很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ...
- nginx平台初识(二) 浏览器 HTTP 协议缓存机制详解
1.缓存的分类 缓存分为服务端侧(server side,比如 Nginx.Apache)和客户端侧(client side,比如 web browser). 服务端缓存又分为 代理服务器缓存 和 反 ...
- java架构之路-(分布式)初识zookeeper安装与参数详解
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
随机推荐
- 2.5---链表来进行加法,链式A+B(CC150)
这里是用了自己的方法,和书本不一样. import java.util.HashSet; import java.util.Set; class ListNode{ int val; ListNode ...
- admin 后台 bs模板
http://bootsnipp.com/ https://almsaeedstudio.com/preview
- phpcms导航中添加内部链接
phpcms中栏目有3中类型 1.普通栏目 2.单网页 3.外部链接 其中如果想添加本站的内部链接,可以使用3,然后在添加链接的地方填入剩下的地址即可(需要以/开头) 如: /index.php?m= ...
- 关闭CENTOS不必要的默认服务
CentOS关闭服务的方法: 图形界面,运行ntsysv chkconfig –level 2345 服务名称 off 服務名稱 建議 說明 acpid 停用 Advanced Configurati ...
- PageImpl是不是有问题?
pageable.getOffset() + content.size() : total这个API 感觉没有实现该有的功能!!!
- Griddle, griddle-react 一个REACT 表格组件
Griddle, griddle-react 一个REACT 表格组件: http://griddlegriddle.github.io/Griddle/index.html
- W3C标准
W3C标准:World Wide Web Consortium 万维网联盟创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构.到目前为止,W3C已经发布了200多项影响深远的W ...
- Java for LeetCode 214 Shortest Palindrome
Given a string S, you are allowed to convert it to a palindrome by adding characters in front of it. ...
- metro中stream转IRandomAccessStream
下面的例子是从zip压缩文件解压出jpg文件流,再显示出来. StorageFile zip = await KnownFolders.PicturesLibrary.GetFileAsync(&qu ...
- js注册读秒进度条
转载自://http://blog.csdn.net/wugouzi/article/details/12621385 <head> <meta http-equiv="C ...