概要:
最近实现了一个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环境就弄好了。