เริ่มต้นอีกครั้งกับ .NET 6 Web API
ทำความรู้จักและติดตั้งใช้งาน .NET 6, VS 2022 บน Windows กันครับ
เนื่องจากงานปัจจุบันหลักๆของผมยังต้องทำงานอยู่กับ .NET Framework 4.8 จึงทำให้ขาดประสบการณ์ในการใช้งาน .NET Core บน Production ไปครับ ผมจึงทำได้แค่ศึกษา .NET Core 2.2 เพื่อทำความเข้าใจกับการพัฒนาด้วยรูปแบบใหม่ๆ
ข่าวดีคือในวันนี้ .NET 6 ได้เปิดตัวพร้อมกับ VS 2022 แล้วเรียบร้อยครับ และผมก็มีโอกาสต้องเอามาใช้งานงานจริงละ เยี่ยมมมม!
ผมเลยอยากกลับมาทบทวนความรู้ของตัวเองด้วยการสร้าง Web API ง่ายๆจากบทเรียนตอนนึงของ Microsoft Document ครับ
เนื้อหาจะเหมาะกับคนที่มีประสบการณ์เขียน .NET มาก่อนแล้วนะครับ เผื่อจะเป็นแนวทางในการทดลองเขียน Web API ด้วย .NET 6 บน VS 2022 นะครับ
ถ้าใครสนใจลงลึกกับ .NET มากขึ้น ผมแนะนำบทความนี้ต่อนะครับเป็นบทความชุดที่ทยอยเขียนครับ ตอนนี้เสร็จสมบูรณ์แล้วประมาณ 11 บทครับ
ความแตกต่างระหว่าง ASP.NET Core และ ASP.NET 4.x
ASP.NET Core
นั้นการออกแบบขึ้นมาใหม่ครับ เพื่อเป็น Open-Source,
Cross-Platform Framework สำหรับการสร้าง Modern Apps ที่สามารถรันบน Windows, macOS, และ Linux ส่วนASP.NET 4.x
นั้นถูกออกแบบมาให้รันได้เฉพาะบน Windows เท่านั้นครับ- โดยจะมี Kestrel ทำหน้าที่เป็น Cross-Platform Web Server สำหรับ
ASP.NET Core
ASP.NET Core
ยังออกแบบให้มีขนาดที่เล็กกว่า (Lightweight) และมีประสิทธิภาพที่ดีขึ้นมาก (High Performance)- จุดที่เด่นๆอีกอย่างของ
ASP.NET Core
คือเรื่องของ Built-in dependency injection ที่มาพร้อมใช้เลยครับ - ศึกษาเพิ่มเติมได้ที่นี้นะครับ
ระยะเวลาการ Support
.NET 6 มีระยะเวลาการ Support แบบ LTS ยาว 3 ปี ตั้งแต่ Nov 08, 2021 ไปจนถึง Nov 08, 2024 เลยครับ เลือกใช้ได้ยาวๆอย่างสบายใจ
ติดตั้ง SDK 6.0.100
Click ลิ้งนี้ แล้วจิ้ม Download เลยครับผมมมม เสร็จแล้วก็ติดตั้งตาม Wizard ได้เลยครับ ง่ายดาย Style Microsoft มากๆ
ติดตั้ง Visual Studio Community 2022
ในบทความนี้จะพาทดลองใช้ Visual Studio Community 2022 เพื่อให้เกิดความคุ้นเคยสำหรับท่านที่เคยใช้ Visual Studio ในรุ่นก่อนๆมานะครับ
จิ้มที่ ลิ้งนี้ เลยครับพี่น้อง ! เสร็จแล้วก็ Click Next รัวๆก็เสร็จสิ้นขบวนการติดตั้ง
สร้าง Web API Project
- เปิด Visual Studio 2022 แล้วเลือก Create a new project
- Search คำว่า
Web API
และเลือกASP.NET Core Web API Project
- เลือก .NET 6.0 LTS
- เลือก
Use Controllers
เพื่อที่จะยังไม่ใช้ Minimal APIs ในตอนนี้ (ในบทความจะกล่าวถึงตอนท้ายๆ) - เลือก
Enable OpenAPI support
เพื่อใช้งาน Swagger
- เสร็จแล้วเราจะได้โครงสร้างดังนี้นะครับ
รัน Web API Project
- ให้เรากดที่เครื่องหมายสามเหลี่ยมสีเขียวได้เลยครับ หรือกดปุ่ม F5
- รอจนกระทั่งมี Web Browser เปิดขึ้นมาครับจะพบหน้าตาของ Swagger นะครับ โดยรายการต่างๆที่แสดงขึ้นมาคือ Web API ที่ระบบสร้างไว้ตอนที่เรา Create New API Project ครับ ชื่อ
WeatherForecase
- ทดลองเรียกใช้งานโดยการกดที่ปุ่ม
Try it out
หลังจากนั้นกดปุ่มExecute
- ระบบจะทำการส่ง HTTP Get Request ไปยัง Endpoint https://localhost:7114/WeatherForecast
- เสร็จแล้วเราจะได้รับ Response กลับมาเป็นค่าพยากรณ์อากาศในแต่ละวันครับผม ดูได้จากภาพผลลัพธ์ข้างล่างนี้นะครับ
- ส่วนถ้าใครสงสัยว่าแล้ว Open API คือตรงไหน ให้ลองกดที่ลิ้ง .json นะครับ แล้วเราจะเจอรายละเอียดของ Web API Specification ที่ระบบสร้างขึ้นมาและ Swagger นำมาแสดงผลให้เรียกใช้ได้สะดวกครับ
อธิบายโครงสร้างและการทำงานของ Web API Project
Kestrel
ทำหน้าที่เป็น Cross-platform Web Server ให้กับ ASP.Net Core ครับ ทำให้เราไม่จำเป็นต้องติดตั้ง IIS เพื่อที่จะทำการรัน Web ขึ้นมาเลย ซึ่งเป็นอะไรที่เจ๋งมากสำหรับผมครับ โดยจะทำการรับ Request จาก Client และนำเข้ามาประมวลผลต่อยัง Middleware (จะอธิบายในลำดับถัดไป) และ App Code ในระบบเราต่อไป
เพียงแต่คุณสมบัติของ Kestrel จะไม่ได้มีเพียงพอกับงานทั้งหมด จำเป็นต้องทำงานร่วมกับกับ Reverse Proxy (เช่น IIS, NGINX) ในการจัดการอื่นๆเช่น Load balancing, Caching, Static content serving, API Gateway, URL rewriting
จากผลลัพธ์ที่เรารันไปก่อนหน้านี้ เราจะพบว่ามี Console Log อธิบายการรัน Microsoft.Hosting ซึ่งก็คือ Kestreal นั้นเองครับผม
Middleware
เป็น Software ที่ถูกประมวลผลอยู่ในรูปแบบของ Pipeline เพื่อใช้ในการจัดการทั้ง Request ที่เข้ามาและ Response ที่ออกไป
- ตัวอย่าง Request เช่น การพิจารณาว่าจะให้ Request ที่เข้ามานี้ส่งต่อไปยัง Component ถัดไปใน Pipeline ไหม
- ตัวอย่าง Response เช่น การเพิ่ม Http Header บางส่วนเข้าไปยัง Response ก่อนที่จะส่งออกไปยัง Component ถัดไปใน Pipeline
- ในภาพตัวอย่างข้างล่างนี้จะเป็นการจำลองให้เห็นทั้ง Flow ของ Middleware Pipeline ที่เกิดขึ้นครับ โดยเริ่มจากการจัดการ Routing, ยืนยันตัวตนและมอบสิทธิ (Authentication, Authorization) และส่งต่อไปทำงานยัง Endpoint ซึ่งจะมีการ Response คำว่า
Hello World!
กลับมา
- อีกภาพจะเป็น Middleware ตัวอย่างที่ให้เห็นการทำงานในการยืนยันตัวตน (Authentication) ว่า ถ้าผ่านการ Login เข้ามาได้แล้วก็จะมอบสิทธิการเข้าใช้ระบบและประมวลผล App Code ต่อไป แต่ถ้า Login ไม่ผ่านก็จะหลุดออกไปจาก Pipeline เลย ไม่ไปทำ Component อื่นต่อครับ
ศึกษาเพิ่มเติมได้ที่นี้นะครับ
Program.cs
เป็น File หลักของระบบที่ช่วยสร้าง Web Application ขึ้นมา ซึ่งผมอยากอธิบายคร่าวๆดังนี้นะครับ
#1: WebApplication.CreateBuilder(args)
ทำหน้าที่สร้าง WebApplicationBuilder
ด้วย Preconfigured Defaults ซึ่งเราจะใช้ในการติดตั้ง Middleware ในลำดับถัดไป
#5: builder.Services.AddControllers()
เป็นการติดตั้ง MVC Service ให้ใช้งานใน Controller File สำหรับ Web API ของเรา
#7: builder.Services.AddEndpointsApiExplorer()
ทำการติดตั้ง Endpoint Specification เพื่อให้ Swagger นำไปใช้ในการแสดงผล Web API ทั้งหมดในระบบ
#8: builder.Services.AddSwaggerGen()
ติดตั้ง Swagger
#10: builder.Build()
เริ่ม Build Web Application
#13-#17: ถ้าระบบรันใน Mode Developer จะมีการแสดงผล Swagger ให้เรียกใช้ แต่ถ้ารันใน Mode อื่น เช่น UAT, Production จะไม่แสดง Swagger
ในการตรวจสอบ Mode นั้นจะดูจาก Hosting Environment ชื่อ
DOTNET_ENVIRONMENT
และASPNETCORE_ENVIRONMENT
นะครับ
ในบทความหน้าจะอธิบายเรื่องนี้อย่างละเอียดอีกครั้ง
ถ้าใครสนใจเนื้อหาสามารถศึกษาเพิ่มเติมเรื่อง Hosting Environment ได้ที่นี้ก่อนครับ
#19: app.UseHttpsRedirection()
เป็นการสร้าง Middleware สำหรับการ Redirect Client ที่เข้า Web ด้วย HTTP ให้ไปเข้าด้วย HTTPS แทนครับ
#21: app.UseAuthorization()
เป็นการสร้าง Middleware สำหรับการมอบสิทธิให้กับ Client
#23: app.MapControllers()
เป็นการ Map Endpoint ให้กับ Controller เพื่อให้ Client เข้าถึงได้
#25 app.Run()
รัน Web กันครับพี่น้อง หลังจากติดตั้งมาหลายอย่างแว้ว !!!
launchSettings.json
เป็น File ที่ใช้ในการควบคุมการรัน Website ตาม Port ที่ต้องการครับ โดยจะมีการสร้าง Profile ขึ้นมาดังนี้
#12: เราทำการสร้าง Profile ชื่อ HelloDotNet6
ซึ่งใช้ในการรันบน Visual Studio 2022 ครับ
#17: เราทำการระบุ Application Endpoint ให้รันที่ URL และ Port https://localhost:7114
#19: เป็นการระบุ Mode ในการรันครับ ซึ่งจะทำการแก้ไขค่า Environment Variable ชื่อ ASPNETCORE_ENVIRONMENT
ให้มีค่าเป็น Development
ซึ่งเรานำไปใช้ใน Program.cs
ในการตรวจสอบ Mode Development ครับ (app.Environment.IsDevelopment()
)
appsettings.json
เป็น Configuration File หลักของระบบครับ โดยใน ASP.NET Core นี้เราสามารถ Configure ค่าได้หลายแบบมากทั้งทำผ่าน appsettings.json หรือแก้ไขผ่าน Environment Variable ของระดับ OS เลยครับ
ในบทความนี้ยังไม่ได้ลงรายละเอียดมากนะครับ ถ้าสนใจสามารถศึกษาบทความนี้ก่อนได้ครับ
ในตัวอย่างนี้จะเป็นการ Configure Log ครับ แต่… เหะๆ เขินจัง ในบทความนี้ก็ยังไม่ได้อธิบายเรื่อง Log ครับ ตั้งใจจะทำในบทความถัดไป กราบบบ (/\)
ใครสนใจเรื่อง Log สามารถศึกษาเพิ่มเติมที่นี้ได้ก่อนเลยครับผม
Nuget
เป็น Package Management สำหรับ .NET ครับ มี Packages ดีๆให้เรียกใช้มากมายเลยครับ ใครสนใจ ศึกษาได้ที่นี้นะครับ
ตัว Web Nuget จะอยู่ที่นี้นะครับ
คำถาม: อ้าว Packages เยอะขนาดนี้ เราควรจะใช้ตัวไหนดีครับพี่
คำตอบ: มาทางนี้เลยซาร่า เราขอนำเสนอ NuGet Must Haves
มาเป็นตัวช่วยในการเลือก NuGet Packages ยอดนิยมให้กับเรา ^^
WeatherForecastController.cs
เป็น App Code หลักของระบบในการสร้าง Logic ให้กับ Web API ของเราครับ
#14-#17: ทำการเรียกใช้ Log ผ่าน Dependency Injection (DI)
ใน Constructor โดยจะอธิบายอย่างละเอียดเรื่อง DI
ในบทความถัดๆไปนะครับ
#19: #28: ทำการสุ่มค่าพยากรณ์อากาศและส่งกลับไปยัง Client โดยจะมี Endpoint มาที่ HTTP Get /WeatherForecast
Minimal APIs
คือ Concepts ของการพัฒนาระบบให้มี Code ที่สั้นลง ดูตัวอย่างได้จากโครงสร้าง Project และ Code ดังนี้
Welcome to the .NET World
สำหรับท่านใดที่สนใจเนื้อหา ASP.NET Core อื่นๆ ผมได้ทำสรุปรวบรวมไว้ที่นี้นะครับ
สรุป
บทความนี้ผมตั้งใจมากๆที่อยากจะใช้เป็นช่องทางเบื้องต้นในการทำความรู้จักกับ ASP.NET Core นะครับ หลายๆอย่างเลยจะมีแค่เนื้อหาที่ง่ายมากๆ แต่ผมก็อยากจะเสริมว่าถ้าสนใจอยากศึกษาอย่างละเอียด เราสามารถไปดูที่ช่องทางอื่นไหนต่อได้บ้าง
อย่างน้อยๆในบทความนี้น่าจะเริ่มทำให้เราคุ้นเคยกับคำศัพท์และเทคนิคต่างๆที่เกี่ยวข้องกับ ASP.Net Core นะครับ เช่น Kestrel, .NET 6 LTS, .NET SDK, Visual Studio 2022, Open API and Swagger, Middleware, Lunch Setting, App Setting, Nuget, NuGet Must Haves, Logging, Dependency Injection (DI), Minimal APIs
จบแล้วคร้าบ กราบผู้อ่านทุกท่าน (/\)
Happy Coding : D