使用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官網檢視文件。
參考: