Nancy的优势在哪里?和微软的MVC比有什么不同,哪个更好?Nancy是否可以脱离IIS等等,那么今天就拿MVC和Nancy做个简单的对比吧。

今天主要讲理论的东西,不写代码,文章中所提到的配置,只是为了帮助理解,详细配置和操作内容还请参考官方帮助文档。

一、Hosting Of Nancy

1、Hosting Nancy with asp.net

方案一:整站都使用Nancy

  在ASP.NET中,Nancy通过设置web.config,使用HTTP handler来处理请求。如果你在Visual Studio中使用了Nancy的模板来创建,就会自动生成webconfig配置,否则就要添加如下配置到webconfig中:

<system.web>
<compilation debug="true" targetFramework="4.0" />
<httpHandlers>
<add verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*"/>
</httpHandlers>
</system.web>

<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<validation validateIntegratedModeConfiguration="false"/>
<handlers>
<add name="Nancy" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*"/>
</handlers>
</system.webServer>

并且还要确定你添加了Nancy和Nancy.Hosting.Aspnet 两个dll的引用。

方案二:网站中一部分使用Nancy

除了使用Nancy搭建整个网站,我们还可以在已存在的网站中使用Nancy来处理某些特定路径的请求。例如我们要处理nancypath下面的所有请求,我们只需要修改上面的配置NancyHttpRequestHandler的path为path="nancypath/*",并且你也要在项目中添加指定路径的文件夹,并在文件夹内放入如下Web.config:

<?xml version="1.0"?>
<configuration>
<system.web>
<httpHandlers>
<add verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*"/>
</httpHandlers>
</system.web>
</configuration>

除此之外,再修改webconfig中的<location>节点配置。

方案三:在MVC中使用Nancy

是的,你没有看错,Nancy和MVC一起使用,如果要在MVC中使用Nancy,需要修改Global.asax.cs文件,添加如下内容:

routes.IgnoreRoute("nancy/{*pathInfo}");

这个时候,所有访问nancy目录的请求,就都会被Nancy处理了,接下来,我们就可以这样写代码了,例如:

public class Home : NancyModule
{
public Home()
{
Get["/nancy/products"] = x => "The products!";
}
}

这部分详细内容参考:https://github.com/NancyFx/Nancy/wiki/Hosting-Nancy-with-asp.net

2.Hosting Nancy with wcf

  如果你想搭建一个轻量级的HTTP服务而又不想使用IIS,Nancy是一个很好的选择,你可以按照下面的操作来实现:

首先,安装Nancy.Hosting.Wcf,Nugget代码如下:

PM> Install-Package Nancy.Hosting.Wcf

然后,编写代码,如下:

var host = new WebServiceHost(new NancyWcfGenericService(),                              new Uri("http://localhost:1234/base/"));
host.AddServiceEndpoint(typeof (NancyWcfGenericService), new WebHttpBinding(), "");
host.Open();// Nancy will now handle requests to http://localhost:1234/base/

然后,Nancy就会侦听本地的1234端口,处理HTTP请求。

这部分详细内容参考:https://github.com/NancyFx/Nancy/wiki/Hosting-Nancy-with-wcf

除此之外,Nancy还有以下Host方式:

Hosting-nancy-with-azure       参考:https://github.com/NancyFx/Nancy/wiki/Hosting-nancy-with-azure

Hosting-nancy-with-owin       参考:https://github.com/NancyFx/Nancy/wiki/Hosting-nancy-with-owin

Hosting-Nancy-with-Umbraco       参考:https://github.com/NancyFx/Nancy/wiki/Hosting-Nancy-with-Umbraco

Hosting-Nancy-with-Nginx-on-Ubuntu 参考:https://github.com/NancyFx/Nancy/wiki/Hosting-Nancy-with-Nginx-on-Ubuntu

Hosting-Nancy-with-FastCgi        参考:https://github.com/NancyFx/Nancy/wiki/Hosting-Nancy-with-FastCgi

Self-Hosting-Nancy             参考:https://github.com/NancyFx/Nancy/wiki/Self-Hosting-Nancy

二、MVC和Nancy中的路由对比

1、Nancy中的路由机制

在上一篇的博文中,我们都知道Nancy中的所有路由都定义在module中的构造方法中,我们上次定义了一个无参路由,如下:

public class HelloModule : NancyModule
{
public HelloModule()
{
Get["/"] = parameters => "Hello World";
}
}

Nancy中有参路由可以这样定义:

public class ProductsModule : NancyModule
{
public ProductsModule()
{
Get["/products/{id}"] = _ =>
{
//do something
};
}
}

或者定义成异步的,如下:

public class ProductsModule : NancyModule
{
public ProductsModule()
{
Get["/products/{id}", runAsync: true] = async (_, token) =>
{
//do something long and tedious
};
}
}

Nancy中支持的method有:DELETE, GET, HEAD, OPTIONS, POST, PUT and PATCH.

当然,Nancy中还支持路由参数约束,例如我们要求参数必须为int类型,我们可以这样定义:

Get["/intConstraint/{value:int}"] = _ => "Value " + _.value + " is an integer.";

除了int类型,Nancy还支持以下类型的约束:

感觉还不够?Nancy还提供了自定义参数约束,比如我们要求参数是一个email,我们可以先定义如下类:

public class EmailRouteSegmentConstraint : RouteSegmentConstraintBase<string>
{
public override string Name
{
get { return "email"; }
}

protected override bool TryMatch(string constraint, string segment, out string matchedValue)
{
if (segment.Contains("@"))
{
matchedValue = segment;
return true;
}

matchedValue = null;
return false;
}
}

然后,定义路由如下:

Get["/profile/{value:email}"] = _ => "Value " + _.value + " is an e-mail address.";

下面是Nancy中路由常用的几种写法:

当然,Nancy的路由机制非常强大、非常灵活,那么当一个地址可以匹配多个路由时,Nancy会选择哪一个呢?其实,Nancy中有一套路由的权重机制来解决路由冲突,这个到后面说路由的时候会详细说的。

2、MVC中的路由机制

我们都知道MVC中的路由配置都在 Global.asax.cs中,当一个ASP.NET MVC应用程序第一次运行时, Application_Start()方法被调用。这个方法,又调用RegisterRoutes()方法,RegisterRoutes()方法创建了路由表。

MVC中的默认路由如下:

public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值 (UrlParameter.Optional-可选的意思)
);
}

NVC中无参路由定义如下:

routes.MapRoute
(    "Home", "{controller}/{action}/{id}");

MVC中带命名空间的路由定义如下:

 routes.MapRoute(      "AdminControllers", // 路由名称"{controller}/{id}-{action}", // 带有参数的 URLnew { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 参数默认值new string[] { "Admin.Controllers" }//命名空间);

MVC中带约束的路由定义如下:

routes.MapRoute(    "RuleControllers",    "{controller}/{action}-{Year}-{Month}-{Day}}",    new { controller = "Home", action = "Index", Year = "2014", Month = "12", Day = "08" },    new { Year = @"^\d{4}", Month = @"\d{2}" } //4位数 2位数);

MVC全局路由:

  routes.MapRoute(        "All", // 路由名称"{*Vauler}", // 带有参数的 URLnew { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值);

综上所述,MVC和Nancy的路由机制从功能上来说不相上下,MVC有的Nancy也有。不过,相比之下,Nancy中的路由更加简单、灵活,毕竟MVC中的路由对于新手来说不是那么容易掌握的。

三、MVC和Nancy中的视图的对比

  当然,视图这块大家还是比较关注的。下面简单对比MVC和Nancy所支持的视图:

  MVC Nancy
WebForm 支持 支持
Razor 支持 支持

这里我们看到MVC和nancy都支持WebForm和Razor视图。并且,Nancy在Razor视图中也支持Model的绑定和部分视图,在Nancy中的部分视图中,也可以使用Modle绑定。

原文链接:http://www.cnblogs.com/yunfeifei/p/4149953.html

Nancy和ASP.NET MVC的简单对比相关推荐

  1. ASP.NET MVC 生成简单的 xml 权限结构

    ASP.NET MVC 生成简单的 xml 权限结构 当我的一个项目到尾声时,发现系统很多模块权限有遗漏.部分模块权限遗漏是由于前期开发速度太快,开发人员未先给模块加权限而后再编写该模块功能代码.当我 ...

  2. ASP.NET MVC实现简单的文件上传与下载

    使用ASP.NET MVC实现简单的文件上传与下载. 1.上传文件HTML <form action='@Url.Action("Upload", "File&qu ...

  3. .NET轻量级MVC框架:Nancy入门教程(二)——Nancy和MVC的简单对比

    在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)--初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy的优势在哪里?和微软的MVC比 ...

  4. ASP.NET MVC Framework体验(1):从一个简单实例开始

    概述 12月10日微软发布了ASP.NET 3.5扩展的预览版,在其中包括了ASP.NET MVC Framework.ASP.NET AJAX改进.ASP.NET动态数据支持.ASP.NET SIl ...

  5. ASP.NET MVC图片文件上传与下载

    说明: 前后端代码中均只用到 ASP.NET MVC原生的技术,不需要用到ajax,WebAPI等. 下篇文章[ jQuery + Ajax + WebAPI 上传文件]会介绍使用Ajax POST来 ...

  6. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截...

    程序猿修仙之路--数据结构之你是否真的懂数组? 数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少.数据 ...

  7. 超级简单:一步一步教你创建一小型的asp.net mvc 应用程序

    超级简单:一步一步教你创建一小型的asp.net mvc 应用程序 这本教程中将帮助你创建一个小型的asp.net mvc示例. 在本教程中,我们将创建自己的 Model , View 和Contro ...

  8. [导入]ASP.NET MVC框架开发系列课程(2):一个简单的ASP.NET MVC应用程序.zip(13.70 MB)...

    讲座内容: 使用ASP.NET MVC框架进行开发与ASP.NET WebForms截然不同.本次课程将通过官方的示例程序简单了解一下ASP.NET MVC应用程序的结构与特点. 课程讲师: 赵劼 M ...

  9. Asp.net MVC 仿照博客园的简单网站首页 列表设计

    本来我打算采用ajax提交请求,异步的请求获取数据,但是我发现如果这样的话就会拖慢开发的进度,拖长时间.所以在这篇博客中仿照首页的列表设计其实和左侧列表网站分类采用了同样的方式,通过局部视图的方式呈现 ...

最新文章

  1. iOS集成sharesdk遇到的坑
  2. 八皇后问题 回溯法hdu2553
  3. all controls within the same view will share the same data Model
  4. DPDK笔记 RSS(receive side scaling)网卡分流机制
  5. Container的限制
  6. 攻击需要成本吗_光伏智能温室建设成本高吗?需要哪种钢结构?
  7. 毕设题目:Matlab元胞自动机城市规划
  8. 深入浅出数据分析读书笔记(head first into data analysis)
  9. OSChina 周三乱弹 ——随风潜入夜,润物细无声,晓看红湿处……
  10. Vue实战之 5.用户管理模块
  11. 为什么地球上只有一个硅谷?
  12. 怎么提高企业微信加人的通过率,让企业微信加更多客户?快速加人,引流拓客有什么技巧(企微运营干货)
  13. 他 25 岁进贝尔实验室,32 岁提信息论,40 岁办达特茅斯会议,晚年患上阿兹海默 | 人物志...
  14. java设计模式---创建者模式
  15. 程序人生 - BD 电影 HD 电影有什么区别啊?哪个好啊?
  16. 【历史上的今天】5 月 12 日:第一台可编程机电子计算机诞生;硅谷先驱出生;饭否上线
  17. c语言bfs算法走迷宫,使用广度优先算法(BFS)走迷宫
  18. 计算智能 — 模糊计算
  19. 无人机航测三维实景建模的价值
  20. DEEPLIZARD强化学习2----预期收益Expected Return

热门文章

  1. 拷贝构造函数的三种使用情况
  2. “文件或目录损坏且无法读取”的简单修复
  3. hive窗口函数必备宝典
  4. linux R语言 安装
  5. excel的筛选功能失效原因
  6. html文字图片一起轮播卡片,简单的堆叠卡片样式jQuery轮播图插件
  7. css3 烟 蚊香_CSS3实现烟花特效 --web前端
  8. MYSQL_精讲数据库数据类型
  9. Java虚拟机是如何识别目标方法的?
  10. POJ 1205 Water Treatment Plants(递推)