跳至頁尾內容
Iron Academy Logo
C#應用程式
C#應用程式

其他類別

在 C# 課程中管理 CORS 和測試 - 構建一個範例 API

[[academy-video-youtube({"vid": "PJlripYcfmw", "start_time": "0", "title": "管理CORS與測試 - 建立C#課程的範例API", "creator": "Tim Corey", "length": "16分鐘 06秒"})]]

當您在C#中使用Web API時,CORS(跨來源資源共享)常常成為一個障礙——特別是當您的前端與後端在不同的域或端口上運行時。 在現代軟體開發中,出現一個常見的情境,即API為前端客戶端(如Blazor WebAssembly、Angular或React)提供服務。

在他的影片教學中,Tim Corey 演示了如何在"C# 建立樣本 API 課程中有效管理 CORS 和測試",同時在建立和測試一個樣本 API 時有效地管理 CORS。 這種方法不僅幫助開發者解決跨域問題,也為更高級的測試技術做準備,比如單元測試、整合測試和自動化工作流程。

讓我們深入影片並逐步跟隨 Tim 的指導。

設置Blazor前端

Tim 開始課程時,建立了一個名為 SampleTestUI 的簡單 Blazor WebAssembly 前端專案。 此前端尚未準備好用於生產,而是一個測試專案,用於驗證與API的連接並故意觸發CORS問題。

  • Tim 使用 .NET 9 模板,並選擇不使用身份驗證或 PWA 功能。

前端的目的是模擬真實世界的API呼叫,並暴露與跨來源請求相關的測試失敗。

他修改了首頁,以調用 /courses API 端點並顯示附帶圖片的課程列表。

前端使用一個單獨建立的簡單模型類別 (CourseModel),而非與API共享模型。 Tim強調前端模型應與資料存取模型分離以減少耦合並提高可維護性 (2:28)。 這是在撰寫可維護的測試和可測試的程式碼時的一個重要原則。

撰寫API呼叫

從API獲取資料:

  • Tim 注入一個 HttpClient。

他使用 Http.GetFromJsonAsync<List<CourseModel>>() 撰寫了一個異步方法。

該方法硬編碼了當地API URL (4:00),作為驗證前端和後端之間通信的簡單測試。

這裡沒有測試方法或錯誤處理,只有一個直接的呼叫。 此設置反映了編寫單元測試的早期步驟,您首先驗證元件之間的基本互動。

構建資料擷取邏輯和UI

在凌晨4:00硬編碼API URL後,Tim專注於構建核心邏輯,以從API抓取課程資料並顯示在Blazor前端。 這是驗證前端能夠與後端互動的一個關鍵步驟,即使在撰寫自動化測試或使用測試框架之前。

首先,他確保從API的launchSettings.json中使用正確的URL,取得HTTPS地址並附加/courses以形成完整的端點。 這很重要,因為瀏覽器通常會拒絕來自安全頁面的非HTTPS API呼叫。

courses = await Http.GetFromJsonAsync<List<CourseModel>>("https://localhost:port/courses");
courses = await Http.GetFromJsonAsync<List<CourseModel>>("https://localhost:port/courses");

顯示資料

一旦資料被擷取後,Tim 使用 Razor 語法撰寫了一個簡單的 UI 迴圈來遍歷課程清單:

@foreach (var c in courses) { <a href="@c.CourseUrl"> <img width="300" src="@c.CourseImage" /> </a> }
@foreach (var c in courses) { <a href="@c.CourseUrl"> <img width="300" src="@c.CourseImage" /> </a> }

每門課程以包裹在超連結中的圖片顯示。 Tim 注意到影像很大(1920x1080),所以他將寬度限制為 300px,以避免頁面顯得過於擁擠。

此輸出作為視覺確認API資料正確流入前端。 這模仿您期望從測試方法通過得到的反饋——如果圖片顯示出來,則請求成功。

準備發射

在運行應用程式之前,Tim在Visual Studio中配置多個啟動專案。 他設置API專案首先啟動,接著是Blazor前端。 這個順序對於確保在前端嘗試獲取資料時API已經準備好是至關重要的。

這個在6:30的最後一步為運行測試做好了準備——並遇到了CORS錯誤——這就是本教程下一部分的開始。

遭遇CORS限制

當 Tim 同時透過Visual Studio的方案總管啟動這兩個專案時,前端試圖呼叫API,但失敗了。 瀏覽器的主控台顯示了一個熟悉的訊息:

"從來源"[Frontend URL]"存取"[API URL]"已被CORS政策阻擋..."(7:02)

這就是了解和管理CORS變得至關重要的地方。 如果沒有適當的標頭,瀏覽器會阻止從一個來源到另一個來源的請求。

建立CORS配置類別

Tim沒有將程式碼塞在Program.cs中,而是在Startup資料夾中建立了一個名為CorsConfig的專用類別。 他使用靜態類別結構來套用與Swagger和OpenAPI設定相同的配置模式。

這符合乾淨程式碼的實踐,並使應用程式更具可測試性。 這樣的模組化配置也使得以後撰寫單元測試方法更加容易,因為邏輯是孤立的,且更容易模擬或覆蓋。

應用寬鬆的CORS政策

Tim 定義了一個非常開放的 CORS 策略來允許完整跨來源存取:

policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();

此設置在測試驅動開發和整合測試中非常有用,尤其是外部服務或前端應用需完全存取API時。 Tim稱這個策略為"AllowAll",並將名稱儲存在常數中以防止拼寫錯誤和不一致性 (11:00):

private const string AllowAllPolicy = "AllowAll";
private const string AllowAllPolicy = "AllowAll";

他指出這不應在生產環境中使用,但在本地或 Docker 容器內測試 APIs 是理想的,特別是當開發者正在對真實端點進行實驗或撰寫單元測試時。

在 Program.cs 中整合配置

Tim在Program.cs中註冊CORS服務並應用配置:

builder.Services.AddCorsServices(); app.ApplyCorsConfig();
builder.Services.AddCorsServices(); app.ApplyCorsConfig();

這種模組化設計提升了程式碼品質,並使將來加入模擬框架或注入測試行為變得更容易。 它反映了您在C#中進行單元測試的結構,其中集中化配置可以簡化測試設置。

重新測試前端

在應用CORS修正之後,Tim重新運行這兩個應用程式。 這次,Blazor前端正常運作——課程資料成功載入,每個課程圖片連結到相關的URL。

重要的是,前端未做任何更改。 整個修復是在API層面完成的,通過正確的CORS配置。

測試和設置策略的課程

雖然 Tim 在這段影片中沒有直接深入單元測試框架,但他的做法為此奠定了基礎。 操作方法如下:

他能夠清楚地分離關注點,從而在未來可以使用測試類和模擬物件。

專用的CORS設定檔可以在測試期間重複使用或用模擬配置替換。

他的快速前端專案就像手動整合測試,在撰寫完整的單元測試專案之前進行早期驗證。

這就像您在Visual Studio中進行測試的方法:

建立一個單元測試專案與您的主要應用程式並行。

使用測試探索器來執行所有測試方法並追蹤結果。

模擬外部相依項,例如HTTP請求、資料庫呼叫或設定檔案。

撰寫簡單的單元測試來驗證預期行為,然後擴展以涵蓋具有邊界情況的測試案例。


CORS場景的單元測試考量

儘管Tim的影片主要關於配置CORS,但其對軟體測試的影響是清楚的:

您可以建立單元測試方法來驗證您的配置服務。

使用模擬框架,模擬不同來源或HTTP方法等外部因素。

將測試執行作為CI/CD流程的一部分,以確保您的測試方法能夠始終通過。

將測試整合到Visual Studio Test Explorer中以追蹤失敗並確保穩定性。

結論

在這個影片教學中,Tim Corey 提供了一個管理 C# Web API 中 CORS 的實際範例,同時構建了一個簡單的 Blazor 前端來測試連接性。 他的做法不僅僅是修復瀏覽器錯誤——它建立了一個結構,鼓勵可維護的程式碼、清晰的架構,並且易於擴展到自動化測試。

從這裡開始,開發者可以充滿信心地進行單元測試的編寫、設置整合測試,並使用像Visual Studio、Test Explorer和模擬框架這樣的工具來提高程式碼的質量和可靠性。

無論您正在學習如何開始測試、撰寫第一個單元測試,還是確保測試方法在預期情況下失敗,本課程都為強大的開發過程提供了基礎。 最重要的是,一切都從獲得正確的架構和配置開始。

Hero Worlddot related to 在 C# 課程中管理 CORS 和測試 - 構建一個範例 API
Hero Affiliate related to 在 C# 課程中管理 CORS 和測試 - 構建一個範例 API

分享您所愛以賺取更多報酬

您是否為使用 .NET、C#、Java、Python 或 Node.js 的開發者建立內容?將您的專業知識轉化為額外收入!

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話