使用Nancy构建基于mono的ASP.NET Web API

使用ASP.NET创建web项目时,一般选择就是ASP.NET的网站应用类型或是web form应用程序类型,不然就是mvc模式。今天介绍一个完全脱离这些类型的.NET框架--Nancy。Nancy框架可以用来处理DELETE、GET、HEAD、OPTIONS、POST、PUT 和PATCH 的请求,并使用了一种简单的、优雅的及DSL的处理方式。

你可以在Nancy的官网了解到更多:http://nancyfx.org/


一、在MonoDevelop 4.0中安装NuGet插件

安装Nancy前,需要先安装MonoDevelop的AddIn---NuGet(关于NuGet)。

打开MonoDevelop,选 择“工具”=》“Add in Manager”。在弹出的对话窗口中,选择“Galley”的Tab页,下拉选择“Manage Repositories”。然后添加一个安装源。

若是MonoDevelop3.0.5,请使用以下地址:

http://mrward.github.com/monodevelop-nuget-addin-repository/3.0.5/main.mrep
若是MonoDevelop 4.0,请使用以下地址:

http://mrward.github.com/monodevelop-nuget-addin-repository/4.0/main.mrep
添加完成后,点击刷新按键,可以看到nuget插件已在列表中:

使用Nancy构建基于mono的ASP.NET Web API_第1张图片

选中后,点击右侧底下的安装按钮,这样就成功的把NuGet安装到MonoDevelop中去了。


二、新建测试项目,并使用Nancy框架。

Nancy框架是可以宿主在ASP.NET的Web框架或MVC框架中的。本文将使用MVC作业 Nancy的宿主。

新建一个项目,我这边将解决方案取名为FirstNancy,把web项目取名为FirstNancy.Web。当解决方案新建完成后,就可以Nuget的管理菜单



在弹出的窗口中,搜索框里输入nancy,添加Nancy、Nancy.Hosting.Aspnet两个组件到解决方案中,这时会在项目中自动添加两个引用:Nancy.dll和Nancy.Hosting.Aspnet.dll。


使用Nancy构建基于mono的ASP.NET Web API_第2张图片


除了添加两个Nancy的引用外,添加操作还会修改Web.config里的httpHandlers模块,这时,你还得手动修改,把之前的MVC的httpHandlers注释掉,最后变成,如下代码:

<httpHandlers>

   <!--      <remove verb="*" path="*.asmx" />

   <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

   <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

   <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false" />

   <add verb="*" path="*.mvc" validate="false" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />-->

   <add verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*" />

</httpHandlers>

同时,把Global.asax里的路由代码去掉,

	public class MvcApplication : System.Web.HttpApplication
	{
		public static void RegisterRoutes (RouteCollection routes)
		{

//			routes.IgnoreRoute ("{resource}.axd/{*pathInfo}");
//
//			routes.MapRoute (
//				"Default",
//				"{controller}/{action}/{id}",
//				new { controller = "Home", action = "Index", id = "" }
//			);
		}
		public static void RegisterGlobalFilters (GlobalFilterCollection filters)
		{
			filters.Add (new HandleErrorAttribute());
		}
		protected void Application_Start ()
		{
			AreaRegistration.RegisterAllAreas ();
			RegisterGlobalFilters (GlobalFilters.Filters);
			RegisterRoutes (RouteTable.Routes);
		}
	}

新建一个DefaultModule.cs模块,代码如下:

using System;
using Nancy;
namespace FirstNacy.Web
{

	public class DefaultModule : NancyModule
	{
		public DefaultModule ()
		{
			Get ["/"] = paramaters =>
			{
				return "<h1>Hello Nancy page!</h1>";
			};

			Get["/mult/{a}/{b}"] = paramaters => 
			{
				int a,b;
				int.TryParse(paramaters.a.ToString(), out a);
				int.TryParse(paramaters.b.ToString(), out b);
				return string.Format("<h3>a * b = {0}</h3>", (a * b).ToString());
			};
		}
	}
}

这边的Module继承自NancyModule,并且在DefaultModule的构造函数中,声明了两个路由。这些框架中的规则都可以在Nancy官网找到。完成后,可以生成,查看测试项目的显示效果,如下:

使用Nancy构建基于mono的ASP.NET Web API_第3张图片

访问带参数的页面,如下:




三、Mono 3.0运行ASP.NET MVC项目时的注意事项

将上述的应用程序放置Ubuntu服务器上,报了错。原因是找不到System.Web.WebPages程序集。

使用Nancy构建基于mono的ASP.NET Web API_第4张图片

后来查到张善友前辈的博客《在mono 3.0 下运行ASP.NET 4网站的主意事项》后,在站点的web.config中,修改了System.Web.WebPages的相关配置,运行成功。

<assemblies>
        	...
        <add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        	...
      </assemblies>


所有有版本号为1.0.0.0的,都要改成2.0.0.0


<appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
   ...
  </appSettings>


Nancy框架有很特性都值得去研究一番,本文只是一个简单的例子,详细的框架规则可上Nancy官网查看文档。


参考:

使用Nancy和Simple.Data两个轻量级的框架打造一个分布式开发系统(一)

在mono 3.0 下运行ASP.NET 4网站的主意事项


你可能感兴趣的:(Web,框架,api,asp.net,Mono,Nancy)