.NET Core版本:1.0.0-rc2
Visual Studio版本:Microsoft Visual Studio Community 2015 Update 2
開發及執行平臺:Windows 7 專業版 Service Pack 1 x64
步驟一、建立ASP.NET Core Web API專案
VS裡面新建專案,Web-->ASP.NET Core Web Application(.NET Core)-->Web API,比如本例中建立的TodoApi專案。
步驟二、在Models資料夾中新建實體、介面及服務倉庫
TodoItem.cs(實體類)
1 namespace TodoApi.Models
2 {
3 public class TodoItem
4 {
5 public string Key { get; set; }
6 public string Name { get; set; }
7 public bool IsComplete { get; set; }
8 }
9 }
ITodoRepository.cs(介面類)
1 using System.Collections.Generic;
2
3 namespace TodoApi.Models
4 {
5 public interface ITodoRepository
6 {
7 void Add(TodoItem item);
8 IEnumerable<TodoItem> GetAll();
9 TodoItem Find(string key);
10 TodoItem Remove(string key);
11 void Update(TodoItem item);
12 }
13 }
TodoRepository.cs(介面實現類,服務的具體實現)
1 using System;
2 using System.Collections.Concurrent;
3 using System.Collections.Generic;
4
5 namespace TodoApi.Models
6 {
7 public class TodoRepository : ITodoRepository
8 {
9 static ConcurrentDictionary<string, TodoItem> _todoItems = new ConcurrentDictionary<string, TodoItem>();
10
11 public TodoRepository()
12 {
13 Add(new TodoItem() {Name = "Item1"});
14 }
15
16 public void Add(TodoItem item)
17 {
18 item.Key = Guid.NewGuid().ToString();
19 _todoItems[item.Key] = item;
20 }
21
22 public IEnumerable<TodoItem> GetAll()
23 {
24 return _todoItems.Values;
25 }
26
27 public TodoItem Find(string key)
28 {
29 TodoItem item;
30 _todoItems.TryGetValue(key, out item);
31 return item;
32 }
33
34 public TodoItem Remove(string key)
35 {
36 TodoItem item;
37 _todoItems.TryGetValue(key, out item);
38 _todoItems.TryRemove(key, out item);
39 return item;
40 }
41
42 public void Update(TodoItem item)
43 {
44 _todoItems[item.Key] = item;
45 }
46 }
47 }
步驟三、在Controllers資料夾中新增Controller類
1 using System.Collections.Generic;
2 using Microsoft.AspNetCore.Mvc;
3 using TodoApi.Models;
4
5 namespace TodoApi.Controllers
6 {
7 [Route("api/[controller]")]
8 public class TodoController : Controller
9 {
10 private ITodoRepository TodoItems { get; set; }
11
12 public TodoController(ITodoRepository todoRepository)
13 {
14 TodoItems = todoRepository;
15 }
16
17 [HttpGet]
18 public IEnumerable<TodoItem> GetAll()
19 {
20 return TodoItems.GetAll();
21 }
22
23 [HttpGet("{id}", Name = "GetTodo")]
24 public IActionResult GetById(string id)
25 {
26 var item = TodoItems.Find(id);
27 if (item == null)
28 {
29 return NotFound();
30 }
31 return new ObjectResult(item);
32 }
33
34 [HttpPost]
35 public IActionResult Create([FromBody] TodoItem todoItem)
36 {
37 if (null == todoItem)
38 {
39 return BadRequest();
40 }
41 TodoItems.Add(todoItem);
42 return CreatedAtRoute("GetTodo", new {controller = "todo", id = todoItem.Key}, todoItem);
43 }
44
45 public IActionResult Update(string id, [FromBody] TodoItem item)
46 {
47 if (item == null || item.Key != id)
48 {
49 return BadRequest();
50 }
51 var todo = TodoItems.Find(id);
52 if (todo == null)
53 {
54 return NotFound();
55 }
56 TodoItems.Update(item);
57 return new NoContentResult();
58 }
59
60 public void Delete(string id)
61 {
62 TodoItems.Remove(id);
63 }
64 }
65 }
在ASP.NET Core 1.0帶來的新特性這篇文章中有提到ASP.NET Core已經把MVC和Web API整合到一起了,所以我們看到Controller類引用的是Microsoft.AspNetCore.Mvc這個NuGet包了,從字面上也可以看出這個整合。
步驟四、編寫用於啟動應用的主入口程式
progrom.cs
1 using System.IO;
2 using Microsoft.AspNetCore.Hosting;
3
4 namespace TodoApi
5 {
6 public class Program
7 {
8 public static void Main(string[] args)
9 {
10 var host = new WebHostBuilder()
11 .UseKestrel() // 使用Kestrel伺服器
12 .UseContentRoot(Directory.GetCurrentDirectory()) // 指定Web伺服器的對應的程式主目錄
13 .UseStartup<Startup>() // 指定Web伺服器啟動時執行的型別,這個約定是Startup類
14 .Build(); // 生成Web伺服器
15 host.Run(); // 執行Web應用程式
16 }
17 }
18 }
步驟五、Startup型別實現
Startup.cs(這個是約定的啟動應用時載入執行的型別,約定包括:型別的名稱,自動生成的相關類方法)
1 using Microsoft.AspNetCore.Builder;
2 using Microsoft.AspNetCore.Hosting;
3 using Microsoft.Extensions.Configuration;
4 using Microsoft.Extensions.DependencyInjection;
5 using Microsoft.Extensions.Logging;
6 using TodoApi.Models;
7
8 namespace TodoApi
9 {
10 public class Startup
11 {
12 public Startup(IHostingEnvironment env)
13 {
14 var builder = new ConfigurationBuilder()
15 .SetBasePath(env.ContentRootPath)
16 .AddJsonFile("appsettings.json", true, true)
17 .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
18 .AddEnvironmentVariables();
19 Configuration = builder.Build();
20 }
21
22 public IConfigurationRoot Configuration { get; }
23
24 // This method gets called by the runtime. Use this method to add services to the container.
25 public void ConfigureServices(IServiceCollection services)
26 {
27 // Add framework services.
28 services.AddMvc();
29
30 // Add our respository type
31 services.AddSingleton<ITodoRepository, TodoRepository>();
32 }
33
34 // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
35 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
36 {
37 loggerFactory.AddConsole(Configuration.GetSection("Logging"));
38 loggerFactory.AddDebug();
39
40 app.UseMvc();
41 }
42 }
43 }
Startup建構函式裡面主要是初始化配置,應用的配置可以是外部自定義的JSON檔案,比如本例中的appsettings.json,我們甚至可以根據不同的環境(FAT,UAT,PRD等)生成給自環境使用的配置檔案,比如:
appsettings.FAT.json、appsettings.UAT.json等,不同的環境根據環境變數{env.EnvironmentName}配置的值來讀取相應的配置檔案。這個{env.EnvironmentName}可以通過專案的Properties下的launchSettings.json檔案進行配置,如下:
1 {
2 "TodoApi": {
3 "commandName": "Project",
4 "launchBrowser": true,
5 "launchUrl": "http://localhost:5000/api/todo",
6 "environmentVariables": {
7 "ASPNETCORE_ENVIRONMENT": "PRD"
8 }
9 }
10 }
11 }
ConfigureServices,Configure方法的作用在在ASP.NET Core 1.0帶來的新特性這篇文章中已有闡述,這裡不再贅述。
步驟六、執行程式
在cmd裡面把當前目錄切換到專案的根目錄,然後依次執行後面的命令:1、dotnet restore 2、dotnet build 3、dotnet run
執行完dotnet run後,應用程式已經啟動起來了,通過控制檯的輸出提示可以看出,Web伺服器在5000埠偵聽請求。
測試一個URL(http://localhost:5000/api/todo):
控制檯輸出info日誌:
我們也可以改變控制檯輸出日誌的級別,只需要更改我們自定義的appsettings.json配置即可,如下:
1 { 2 "Logging": { 3 "IncludeScopes": false, 4 "LogLevel": { 5 "Default": "Debug", 6 "System": "Debug", 7 "Microsoft": "Warning" 8 } 9 } 10 }
把“Microsoft”的值改成:“Warning”,這樣上述info級別的日誌就不會再輸出了(Warning,Error級別的日誌才會輸出)。