Web API2 非同步請求-搭建Xamarin Studio環境
阿新 • • 發佈:2018-12-27
概要:
最近實現了一個API,該服務是host在linux伺服器上的,基於於nginx+mono, 整個開發過程都是在mac上完成的,所以我用的IDE是Xamarin。
說到非同步程式設計,我們就會想到 async 和 await關鍵字,用這兩個關鍵字使非同步變得非常的簡單。為什麼要用非同步,我來講個故事, 在一伺服器上,它維護的執行緒是有限的,比如.net 4.5 framework, 執行緒池可維護的最大執行緒數大約是5000,假如我用同涉請求,當併發達到最大值時,伺服器不會再響應請求,這樣伺服器就會返回503(sever too busy), 並且當併發增加時,伺服器的響應速度越來越慢,因為多開一個執行緒大約要消耗記憶體,但是如果我們使用非同步的話,處理同樣的併發,執行緒就要少很多,因為它不會一直佔用一個執行緒。故事就扯到這裡,下面我們就來建立一下WebAPI專案
1,開啟Xamarin Studio,建立一個基於C#的一個MVC專案(我用的是.net framework 4.5)
在Xamarin裡沒有WebAPI的模板,我們得手動引用類庫
2,用NuGet引用Microsoft.AspNet.WebApi的庫
3,建立一個名叫 AsyncController 類,引用System.Web.Http, 繼承ApiController 如下程式碼
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Http; using System.Web.Mvc; using System.Threading.Tasks; namespace ThreadProcess.Controllers { public class AsyncController : ApiController{ [System.Web.Http.AcceptVerbs("GET","POST")] public async Task<IList<string>> GetProducts() { await Task.Delay(4000); return new List<string>{"test1:","test2" }; } } }
4,增加一個 MapHttpRoute 在Global.asax裡
public static void RegisterRoutes (RouteCollection routes) { routes.IgnoreRoute ("{resource}.axd/{*pathInfo}"); routes.MapHttpRoute(name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); routes.MapRoute ( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" } ); }
經過上面的4步,我們的WebAPI環境就弄好了。