微軟推出的Asp.net vNext(asp.net 5.0)的其中的一個目標就是統一mvc 和web api 的框架。接下來我就演示一下一下幾個內容
1,怎么在Asp.net mvc 6 中創建簡單的web api。
2,怎么在空的項目工程中添加程序需要的組件。
3,怎么去配置Asp.net 5.0 管道。
4,怎么不通過IIS自我托管。
首先需要安裝Visual Studio 2015 Preview,安裝完之后,打開File >New >Project 然后 Template>C#>Web 新建一個Asp.Net Web Application 我命名為WebApiDemo:之后要選擇 Asp.net 5 Empty 然后選擇ok 就可以了 :
項目包括如下幾個文件:
- global.json 是包括整個solution的設置並且可以確保項目和項目之間的引用。
- project.json 是這個工程的配置。
- Startup.cs 是 startup 和 配置的代碼。
在Startup.cs 中配置asp.net 的請求管道,
1 public class Startup 2 { 3 public void Configure(IApplicationBuilder app) 4 { 5 // Nothing here! 6 } 7 }
如果現在運行項目會發現什么也沒有,那我們就先簡單的添加一個歡迎頁面,打開project.json 文件,這個文件可以配置我們這個程序的一些設置
1 { 2 "webroot": "wwwroot", 3 "version": "1.0.0-*", 4 "exclude": [ 5 "wwwroot" 6 ], 7 "packExclude": [ 8 "**.kproj", 9 "**.user", 10 "**.vspscc" 11 ], 12 "dependencies": { 13 "Microsoft.AspNet.Server.IIS": "1.0.0-beta1" 14 }, 15 "frameworks" : { 16 "aspnet50" : { }, 17 "aspnetcore50" : { } 18 } 19 }
其中 "dependencies" 是一些Nuget 包和類庫。我們先添加一個 Microsoft.AspNet.Diagnostics 。添加的時候會有只能提示。
"dependencies": {
"Microsoft.AspNet.Server.IIS": "1.0.0-beta1",
"Microsoft.AspNet.Diagnostics": "1.0.0-beta1"
},
然后再Startup.cs 中添加
1 public class Startup 2 { 3 public void Configure(IApplicationBuilder app) 4 { 5 // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940 6 7 app.UseWelcomePage(); 8 } 9 }
然后f5 運行 效果就出來了:
簡單的創建了一個頁面,接下來我們就進入正題,創建web api。
同樣我們需要在project.json 中添加mvc 6的包
1 "dependencies": { 2 "Microsoft.AspNet.Server.IIS": "1.0.0-beta1", 3 "Microsoft.AspNet.Diagnostics": "1.0.0-beta1", 4 "Microsoft.AspNet.Mvc": "6.0.0-beta1" 5 },
接下來添加mvc 的請求管道在startup.cs 中
先引用 Microsoft.Framework.DependencyInjection,
然后添加如下方法:
1 public void ConfigureServices(IServiceCollection services) 2 { 3 4 services.AddMvc(); 5 }
注意方法名不要錯了,在程序啟動的時候 mvc 框架會自動運行這個方法。
然后在 Startup.cs 的configure方法中添加代碼: app.UseMvc();
然后新建一個Models文件夾 里面新建一個類Test
1 public class Test 2 { 3 public int Id { get; set; } 5 [Required] 6 public string Title { get; set; } 7 }
同樣新建一個文件夾Controller 然后新建一個HomeController 的Wep Api 的 controller。
1 namespace WebApiDemo.Controllers.Controllers 2 { 3 //注意這個寫法,web api 的路由 不要忘了前面的api當然你可以隨意的命名 4 [Route("api/[controller]")] 5 public class HomeController : Controller 6 { 7 8 public static List<Test> list = new List<Test>() { 9 new Test() { Id=1, Title="test1" }, 10 new Test() { Id=2, Title="test2" } 11 }; 12 13 14 15 // GET: api/values 16 //獲得所有數據 17 [HttpGet] 18 public IEnumerable<Test> Get() 19 { 20 return list; 21 } 22 23 //按照id 查找數據 其中HttpGet 中 {id} 是模板 Name是路由的名字在mvc 5中的api 中HttpGet 是沒有參數的。 24 // GET api/values/5 25 [HttpGet("{id}", Name = "getbyid")] 26 public IActionResult Get(int id) 27 { 28 var item = list.FirstOrDefault(p => p.Id.Equals(id)); 29 30 if (item == null) 31 { 32 return HttpNotFound(); 33 } 34 35 return new ObjectResult(item); 36 37 } 38 39 // POST api/values 40 //添加數據 41 [HttpPost] 42 public void Post([FromBody]Test value) 43 { 44 if (!ModelState.IsValid) 45 { 46 Context.Response.StatusCode = 400; 47 } 48 else 49 { 50 value.Id = list.Max(p => p.Id) + 1; 51 list.Add(value); 52 53 string url = Url.RouteUrl("getbyid", new { id = value.Id }); 54 55 Context.Response.StatusCode = 201; 56 //添加成功之后,跳轉看是否添加成功 57 Context.Response.Headers["Location"] = url; 58 } 59 60 61 } 62 63 //更新數據 64 // PUT api/values/5 65 [HttpPut("{id}")] 66 public IActionResult Put(int id, [FromBody]Test value) 67 { 68 if (!ModelState.IsValid) 69 { 70 return new HttpStatusCodeResult(500); 71 } 72 else 73 { 74 var item = list.FirstOrDefault(p => p.Id.Equals(id)); 75 76 if (item == null) 77 { 78 return HttpNotFound(); 79 } 80 else 81 { 82 83 value.Id = item.Id; 84 85 list.Remove(item); 86 list.Add(value); 87 88 return new ObjectResult(value); 89 } 90 91 } 92 } 93 94 //刪除數據 95 // DELETE api/values/5 96 [HttpDelete("{id}")] 97 public IActionResult Delete(int id) 98 { 99 100 var item = list.FirstOrDefault(x => x.Id == id); 101 if (item == null) 102 { 103 return HttpNotFound(); 104 } 105 list.Remove(item); 106 return new HttpStatusCodeResult(204); 107 } 108 } 109 }
該注釋的我已經注釋了。ok 看看效果:
我們發現每次f5 運行項目的時候都要通過運行IIS Express 我們才能運行我們的程序,那么有沒有可能不通過IIS也能運行我們的程序呢?對於asp.net 5.0 來說答案是肯定的。 我們看一下是怎么做的? asp.net 5.0 可以托管到多種的web server 上 ,這里選擇WebListener。即我們可以通過控制台來托管我們程序。
首先在 project.json 中添加Microsoft.AspNet.Server.WebListener包。另外還需要新加一個 "commands" 的設置完整的內容如下:
1 { 2 "webroot": "wwwroot", 3 "version": "1.0.0-*", 4 "exclude": [ 5 "wwwroot" 6 ], 7 "packExclude": [ 8 "**.kproj", 9 "**.user", 10 "**.vspscc" 11 ], 12 "dependencies": { 13 "Microsoft.AspNet.Server.IIS": "1.0.0-beta1", 14 "Microsoft.AspNet.Diagnostics": "1.0.0-beta1", 15 "Microsoft.AspNet.Mvc": "6.0.0-beta1", 16 "Microsoft.AspNet.Server.WebListener": "1.0.0-beta1" 17 }, 18 "frameworks": { 19 "aspnet50": { }, 20 "aspnetcore50": { } 21 }, 22 "commands": { 23 "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000" 24 } 25 26 }
然后右鍵項目屬性的debug 選項 設置debug target 為web
然后F5運行:
這樣程序就托管成功了。打開瀏覽器輸入地址:
Ok成功了。關於asp.net 5.0 的一些新特性我還在研究,以后我還會發布相關的文章。Asp.net 5.0 這次的變動真的非常的讓人激動。