1. 程式人生 > >使用Nancy構建基於mono的ASP.NET Web API

使用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的處理方式。

一、在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外掛已在列表中:


選中後,點選右側底下的安裝按鈕,這樣就成功的把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的引用外,新增操作還會修改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官網找到。完成後,可以生成,檢視測試專案的顯示效果,如下:


訪問帶引數的頁面,如下:


三、Mono 3.0執行ASP.NET MVC專案時的注意事項

將上述的應用程式放置Ubuntu伺服器上,報了錯。原因是找不到System.Web.WebPages程式集。


後來查到張善友前輩的部落格《在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官網檢視文件。


參考: