เริ่มต้นอีกครั้งกับ .NET 6 Web API

ทำความรู้จักและติดตั้งใช้งาน .NET 6, VS 2022 บน Windows กันครับ

Ponggun
T. T. Software Solution
6 min readNov 16, 2021

--

เนื่องจากงานปัจจุบันหลักๆของผมยังต้องทำงานอยู่กับ .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 เลยครับ เลือกใช้ได้ยาวๆอย่างสบายใจ

dotnet.microsoft.com/platform/support/policy

ติดตั้ง 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
  • เสร็จแล้วเราจะได้โครงสร้างดังนี้นะครับ

รัน 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 นำมาแสดงผลให้เรียกใช้ได้สะดวกครับ

https://localhost:7114/swagger/v1/swagger.json

อธิบายโครงสร้างและการทำงานของ Web API Project

Kestrel

ทำหน้าที่เป็น Cross-platform Web Server ให้กับ ASP.Net Core ครับ ทำให้เราไม่จำเป็นต้องติดตั้ง IIS เพื่อที่จะทำการรัน Web ขึ้นมาเลย ซึ่งเป็นอะไรที่เจ๋งมากสำหรับผมครับ โดยจะทำการรับ Request จาก Client และนำเข้ามาประมวลผลต่อยัง Middleware (จะอธิบายในลำดับถัดไป) และ App Code ในระบบเราต่อไป

coderethinked.com/how-does-asp-net-core-processes-a-request

เพียงแต่คุณสมบัติของ 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 ขึ้นมา ซึ่งผมอยากอธิบายคร่าวๆดังนี้นะครับ

ภาพตัวอย่าง Program.cs

#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 จะอยู่ที่นี้นะครับ

Website Nuget มี Packages เยอะมว้ากกก

คำถาม: อ้าว Packages เยอะขนาดนี้ เราควรจะใช้ตัวไหนดีครับพี่

คำตอบ: มาทางนี้เลยซาร่า เราขอนำเสนอ NuGet Must Haves มาเป็นตัวช่วยในการเลือก NuGet Packages ยอดนิยมให้กับเรา ^^

https://nugetmusthaves.com/

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 ดังนี้

ทางซ้ายแบบ ปรกติ ทางขวาแบบ Minimal APIs
ตัวอย่าง Code min-web-api ซึ่งจะพบว่าเรารวม Program.cs และ Controller เข้าด้วยกัน หน้าตาออกมาคล้าย Express.js เบย

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

--

--

Ponggun
T. T. Software Solution

Development Manager, Web Developer with ASP.Net, ASP.net Core, Azure and Microsoft Technologies