跳過到頁腳內容
Iron Academy Logo
C# 應用程式
C# 應用程式

其他分類

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

Tim Corey
16分06秒

當使用C#的網頁API時,CORS(跨域資源共享)常常成為一個障礙,特別是當您的前端和後端位於不同的域名或端口時。 這是現代軟體開發中的常見情況,其中API為像Blazor WebAssembly、Angular或React之類的前端客戶端提供服務。

在他關於"管理CORS和測試 - 建立範例API在C#課程中"的視頻教學中,Tim Corey 演示了如何在建立和測試範例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>() 的非同步方法。

該方法已通過硬編碼設定了本地API URL(4:00),用作一個簡單的測試以驗證前端和後端之間的通信。

這裡沒有測試方法或錯誤處理,僅僅是一個直接的呼叫。 此設置鏡像了撰寫單元測試的早期步驟,您從驗證組件之間的基本互動開始。

建構資料獲取邏輯與使用者介面

在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策略阻止...

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

建立CORS設定類別

Tim在Startup資料夾中創建了一個名為CorsConfig的專用類,而不是混亂使用Program.cs。 他使用靜態類別結構來應用與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容器中測試API,當開發者正在進行實驗或針對真實端點撰寫單元測試時。

在 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中進行測試的方法:

在您的主應用程式旁建立一個單元測試專案。

使用 Test Explorer 來執行所有測試方法並追蹤結果。

模擬外部相依性,如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 管理CORS和測試 - 在C#課程中構建一個示例API
Hero Affiliate related to 管理CORS和測試 - 在C#課程中構建一個示例API

通過分享您所愛的東西賺得更多

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

鋼鐵支援團隊

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