Nancy

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

  1. 自底向上全套都是新构建的,移除了对其他框架的引用和限制。
  2. Run anywhere. Nancy 能够在ASP.NET/IIS,OWIN,Self-hosting中运行。
  3. 集成支持各种View engine(Razor, Spark, dotLiquid, SuperSimpleViewEngine...)
  4. 一个强力而且轻量级的测试框架。
  5. 内容协商。
  6. 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; }
}

つづく

分类: C#

时间: 2024-10-17 18:27:53

Nancy的相关文章

Nancy之基于Self Hosting的补充小Demo

前面把Hosting Nancy with ASP.NET.Self Hosting Nancy和Hosting Nancy with OWIN 以demo的形式简单描述了一下. 这篇是为Self Hosting Nancy.和Owin 下面的Self Hosting作个补充. 首先是Self Hosting Nancy的补充: 这里主要是介绍一下Topshelf 官网:http://topshelf-project.com/ GitHub地址:https://github.com/Topshe

Nancy之实现API

Nancy之实现API的功能 0x01.前言 现阶段,用来实现API的可能大部分用的是ASP.NET Web API或者是ASP.NET MVC,毕竟是微软官方出产的,用的人也多. 但是呢,NancyFx也是一个很不错的选择.毕竟人家的官方文档都是这样写的:framework for building HTTP based services. 本文主要是通过一个简单的场景和简单的实现来说明. 0x02.场景假设与分析 现在A公司与B公司有一些业务上的合作,B公司要得到一些关于A公司产品的信息 所

Nancy之基于Nancy.Owin的小Demo

前面做了基于Nancy.Hosting.Aspnet和Nancy.Hosting.Self的小Demo 今天我们来做个基于Nancy.Owin的小Demo 开始之前我们来说说什么是Owin和Katana 什么是Owin呢? 官网地址:http://owin.org OWIN在.NET Web Servers与Web Application之间定义了一套标准接口,OWIN的目标是用于解耦Web Server和Web Application. 什么是Katana呢? 官网地址:http://kata

Nancy FormsAuthentication使用

1.新建UserDatabase类,实现IUserMapper接口 using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Security.Principal; using Nancy.Authentication.Forms; public class UserDatabase : IUserMapper { private st

Nancy 引用源码与NuGet安装差异

使用NuGet安装Nancy和直接引用源码项目存在一些差异,如序列化,授权验证问题. 如果引用源码的话,自定义JsonSerializer,如下: 注意,需要使用NuGet安装Newtonsoft.Json public class CustomJsonNetSerializer : JsonSerializer, ISerializer { public bool CanSerialize(MediaRange mediaRange) { return mediaRange.ToString(

nancy中的身份验证

在nancy中,身份验证分为basic ,form ,token,stateless几种,basic和form这里不说了,其中如果是使用cookie来保存身份的, 需要注意的是:cookie有大小的限制,所以不能用来保存超过4k的信息,而且有一些js插件也要用的cookie,虽然html5好像多了.但是还是要注意一下.因为之前看到文章有的人网站有时候登陆出现问题,就是因为用户信息太大导致的. 这里说的是token的验证. ITokenizer 这个是定义token的接口,Tokenizer是它的

记一次Nancy 框架中遇到的坑

记一次Nancy 框架中遇到的坑 前几天,公司一个项目运行很久的Nancy框架的网站,遇到了一个很诡异的问题.Session 对象跳转到另外一个页面的时候,session对象被清空了,导致用户登录不上.搞了两天,终于解决了.于是把它记录下来,以避免其他人也碰到这种情况. 起因 公司一个Nancy 框架 开发的web网站,以前一直都是好的,nancy 框架也用在了很多项目里面,基本上已经很成熟很稳定了,但是在前几天发布某个web网站的时候,竟然出现部分用户登录不上的情况.刚开始以为是人员的权限有问

第五章 Nancy 路由

在Nancy中,最为神奇的莫过于路由了,定义路由模块是构成Nancy应用的骨架.在Nancy中定义路由,和在 ASP.NET MVC那些类似的框架中有着非常大的区别. 以 ASP.NET MVC 为例,通常情况需要创建一个控制类.多数情况下,这个类提供了路由的约定.通过定义您的控制器类名和该类中的方法的名称,就能定义了该代码所处理的"路由" 请看下面的例子: using System; using System.Linq; using System.Web.Mvc; namespace

Nancy之Cache的简单使用

一.前言 说起缓存,或许大家都不陌生,甚至是天天都在用!当然缓存也被分的越来越细,页面缓存.数据缓存.文件缓存等等. 其实呢,我个人觉得,主要还是两大类:数据的缓存和页面的缓存.数据缓存的话就包括所有跟数据扯上关系的都可以 归到这一类,至于页面缓存的话,就是把一些页面缓存起来,尤其是静态的页面,对访问速度可以说是杠杠的.本文主要 介绍的是数据的缓存.当然本文说是这Nancy中使用,但是这一块是通用的,无论你是在MVC.WebForm.甚至是最新的 Asp.Net Core都是基本一致的.可以选择