如何在 Blazor Web assembly 中使用“Sec-Fetch-Mode: no-cors”进行 http 请求

Fab*_*nus 7 blazor-client-side sec-fetch-mode

如何在 Blazor Web assembly 中通过 HttpClient 使用 HTTP 请求标头Sec-Fetch-Mode: no-cors发出请求?

我的实际代码是:

var hc = new HttpClient();
var responseHTTP = await hc.GetAsync("https://www.somedomain.com/api/");
Run Code Online (Sandbox Code Playgroud)

但这会产生以下 HTTP 请求标头:

:authority: www.somedomain.com
:method: GET
:path: /api/json?input=test&key=AIzaSyDqWvsxxxxxxxxxxxxxxxxx1R7x2qoSkc&sessiontoken=136db14b-88bd-4730-a0b2-9b6c1861d9c7
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
origin: http://localhost:5000
referer: http://localhost:5000/places
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: cross-site
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36
x-client-data: CJS2yQxxxxxxxxxxxxxxxxxxxxxxxxygEI7bXKAQiOusoBCObGygE=

Run Code Online (Sandbox Code Playgroud)

小智 8

要具体回答您的问题,您需要创建一个HttpRequestMessage第一个。

例如

var request = new HttpRequestMessage(HttpMethod.Get, "https://www.somedomain.com/api/");
request.SetBrowserRequestMode(BrowserRequestMode.NoCors);  
request.SetBrowserRequestCache(BrowserRequestCache.NoStore); //optional            
using (var httpClient = new HttpClient())            
{
    var response = await httpClient.SendAsync(request);
    var content = await response.Content.ReadAsStringAsync();        
}
Run Code Online (Sandbox Code Playgroud)

这将正确地将sec-fetch-mode标头设置为no-cors 我发现的,但是,即使在 fiddler 中检查时响应仍然存在,响应也会返回为空。
我最接近理解这个问题是通过这里的这个问题,但不幸的是该错误已被关闭。

  • 请注意:您必须首先添加 Microsoft.AspNetCore.Components.WebAssembly 库,以便在 HttpRequestMessage 中具有可用的“SetBrowserRequestMode”和“SetBrowserRequestCache”方法。 (3认同)
  • 该解决方案适用于我的应用程序。我用它发出 HEAD 请求,从未启用 CORS 的服务器获取标头中的“上次修改”日期。即使启用了 NoCors,浏览器也不会将内容传递给您的代码,但如果您只想读取标头或测试连接,它仍然很有用。+1 (2认同)