ASP.NET Core 1.0開發Web API程式

FrankYou發表於2016-06-17

.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級別的日誌才會輸出)。

 

相關文章