1. 程式人生 > >Web API2 非同步請求-搭建Xamarin Studio環境

Web API2 非同步請求-搭建Xamarin Studio環境

概要:

  最近實現了一個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環境就弄好了。