iT邦幫忙

2025 iThome 鐵人賽

DAY 24
0
佛心分享-SideProject30

30天的旅程!從學習C#到開發小專案系列 第 24

DAY 24 - 解決CORS(跨域資源共享)問題

  • 分享至 

  • xImage
  •  

哈囉大家好!
今天要分享的內容是我的debug過程XD
實際測試了一下登入功能,發現沒有辦法順利把User資訊儲存到Neon資料庫中,
看了console發現顯示「Http Error 405」的錯誤訊息。

HTTP 405 (Method Not Allowed)

這裡要科普一下HTTP 405,通常這個錯誤代碼表示伺服器有接收到請求,但URL不接受我使用的HTTP method(例如:我對只接受GET Request的API endpoint 發送了POST Request)

CORS問題

CORS錯誤通常會在瀏覽器console中顯示「CORS policy Error」或「HTTP 404/0」。但CORS的預檢請求(OPTIONS 請求)如果被阻止,也可能會導致最後console顯示和HTTP 405相關的錯誤,因為瀏覽器不允許送出實際的POST Request。

處理CORS問題

因為我目前開發的環境中,Angular前端(http://localhost:4200)正在向C# API(http://localhost:5232)發送跨域請求,所以必須在Program.cs檔中配置CORS服務。
通常在Program.cs檔中,會定義一個或多個CORS策略,
目前因為在本地開發,所以最簡單的方式是允許Angular的開發位置(http://localhost:4200):

...
var builder = WebApplication.CreateBuilder(args);
const string goDutchAllowedOrigins = "_GoDutchAllowedOrigins";

...
// 添加CORS服務
builder.Services.AddCors(options =>
{
    options.AddPolicy(name: goDutchAllowedOrigins,
        policy =>
        {
            policy.WithOrigins("http://localhost:4200") //允許Angular前端URL
                  .AllowAnyHeader()                     //允許任何Request Header
                  .AllowAnyMethod();                     //允許所有HTTP method
        });
});

...
// 使用CORS服務(要在UseAuthentication和UseAuthorization之前使用)
app.UseCors(goDutchAllowedOrigins); 

app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();

app.Run();

比較特別的是,把CORS服務放在最前面做使用的部分!
因為CORS策略決定了「誰有權發送這個請求」、「用什麼method」、「帶著什麼樣的Header」。
如果CORS策略不允許,API要立馬拒絕該請求,並且回傳特定的CORS相關響應Header,
就像守門員一樣,第一關就把不符合條件的請求擋住。

檢查前端URL是否正確

除了配置CORS服務之外,也要再檢查前端發送請求的URL和對應HTTP Method是否正確~


上一篇
DAY 23 - 配置JWT Bearer 認證中介軟體(Middleware)
系列文
30天的旅程!從學習C#到開發小專案24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言