发布:2023/12/7 15:20:57作者:大数据 来源:大数据 浏览次数:582
大部分微软平台的开发人员如果选择开发框架只能是在ASP.NET WEBFORM和ASP.NET MVC两个之间选择。 而Nancy是不依赖于这两个框架的独立的一个框架。它更多的是借鉴了Ruby的一些特性。
Nancy 是一个基于 .NET 和 Mono 平台用于构建轻量级基于 HTTP 的 Web 服务。Nancy 设计用于处理 DELETE
, GET
, HEAD
, OPTIONS
, POST
, PUT
和 PATCH
等请求方法,并提供简单优雅的 DSL 以返回响应。 官方网站 http://nancyfx.org/
更详细的介绍参见 http://blog.spinthemoose.com/2011/07/18/nancy-a-micro-web-framework-for-net/
顺便介绍个使用Nancy 做的Quartz.net的web控制台 https://quartznetwebconsole.codeplex.com/
参考文章:
使用Nancy和Simple.Data两个轻量级的框架打造一个分布式开发系统(一)
Frictionless .NET Web App Development with Nancy
Frictionless .NET Web App Development with Nancy Part II - Introducing a View Engine
Frictionless .NET Web App Development with Nancy Part III - Introducing MongoDB
Frictionless .NET Web App Development with Nancy Part IV – Hosting
Slides from ANUG talk on Nancy
扩展NoteService,支持NancyFx
用Nancy和Simple.Data创建一个图片博客 第一部分:开始一个工程
用Nancy和Simple.Data创建一个图片博客 第二部分:定义routes
用Nancy和Simple.Data创建一个图片博客 第三部分:渲染一些Views
Integrating Nancy with protobuf-net
Build Simple Web UIs with the Nancy Framework
轻量级MVC框架:Nancy学习
Nancy 是一个轻量级的,简单粗暴的framework用来构建基于HTTP的各种服务,兼容.Net和Mono。Nancy的整套设计理念是基于"super-duper-happy-path",这是一个作者杜撰的单词,个人觉得翻译过来基本就是简单粗暴,行之有效的意思。
简单的例子:
1 2 3 4 5 6 7 8 9 |
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!
,这句话让我深深的感受到这群程序员的可爱。
如果本文就这样结束了,那和其他介绍的文字就没有多大的区别了。让我们坐上github的时光机,开始我们的扒皮之旅。
这个时候的Nancy 就如同一个刚出生的婴儿,也正因为如此,才便于我们入手。入口点当然是大家耳熟能详的IHttpHandler
。这里的IsReusable
可是false的,有一定的性能损失,这里的知识点大家可以参见另外的博文。
1 2 3 4 5 6 7 8 9 10 11 12 |
public class NancyHttpRequestHandler : IHttpHandler { public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { //... } } |
既然刚出生,自然问题很多,就如同下面的代码,这里本着不吐槽的原则,只是笑而不语,恩恩。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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都直接用=
赋值即可,当然这么做会带来一定的副作用。
1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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); } |
1 |
1 |
具体的隐式转换倒是没啥内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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 的包装暂时只是占了个坑,后续版本有补充cookie的一些操作在这里。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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; } } |
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4