我正在嘗試使用以下代碼從我的 api 獲取資料:
_httpClient.DefaultRequestHeaders.Accept.Clear();
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var content = new StringContent(JsonConvert.SerializeObject(parameters), UTF8Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync(uri, content);
不幸的是,當我試圖用 Fiddler 除錯這個請求時,它會產生這個原始請求。
OPTIONS https://localhost:7052/v1/users/login HTTP/1.1
Host: localhost:7052
Connection: keep-alive
Accept: */*
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Origin: https://localhost:7063
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
Sec-Fetch-Dest: empty
Referer: https://localhost:7063/
Accept-Encoding: gzip, deflate, br
Accept-Language: pl,en;q=0.9,en-GB;q=0.8,en-US;q=0.7
正確的應該是:
POST https://localhost:7052/v1/users/login HTTP/1.1
Host: localhost:7052
Connection: keep-alive
Content-Length: 50
Pragma: no-cache
Cache-Control: no-cache
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="100", "Microsoft Edge";v="100"
accept: application/json
Content-Type: application/json
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44
sec-ch-ua-platform: "Windows"
Origin: https://localhost:7052
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://localhost:7052/swagger/index.html
Accept-Encoding: gzip, deflate, br
Accept-Language: pl,en;q=0.9,en-GB;q=0.8,en-US;q=0.7
{
"username": "string",
"password": "string"
}
我正在努力解決這個問題,也許我錯過了一些明顯的東西?
編輯:我的 CORS 配置錯誤。感謝 Panagiotis Kanavos 為我指明了正確的方向。
在我最小的 api 專案中,我必須配置 CORS 策略
builder.Services.AddCors(options => options.AddDefaultPolicy(builder =>
builder.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
));
前
app.UseCors();
uj5u.com熱心網友回復:
代理字串表明您正在使用 Blazor 并使用 CORS 向站點發送請求。該OPTIONS請求是CORS 飛行前請求,完全正常。瀏覽器詢問服務器是否可以發出 POST 請求。
如果您使用瀏覽器的開發人員工具,您將在 OPTIONS 請求之后立即看到 POST 請求。
正如檔案解釋的那樣:
對于某些 CORS 請求,瀏覽器會在發送對資源的實際請求之前發送一個額外的請求,稱為“預檢請求”。
如果滿足以下條件,瀏覽器可以跳過預檢請求:
請求方法是 GET、HEAD 或 POST,并且
除 Accept、Accept-Language、Content-Language、Content-Type 或 Last-Event-ID 外,應用程式不設定任何請求標頭,并且
Content-Type 標頭(如果設定)是以下之一:
- 應用程式/x-www-form-urlencoded
- 多部分/表單資料
- 文本/純文本
您正在發送 JSON 字串,因此無法避免預檢請求。
在 .NET 6 中,您可以使用PostAsJsonAsync并洗掉大部分代碼,但不能洗掉 OPTIONS 請求。
由于 .NET 6 是當前的 LTS 版本,因此您遲早應該遷移到它。.NET 5在 3 周內停止支持。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/460116.html
下一篇:無法對可觀察結果呼叫函式
