Blazor WASM跨域请求返回200但内容空,配置CORS后遭拦截求助
Blazor WASM 跨域请求问题解决
问题场景
开发Blazor WASM ASP.NET Core托管应用时,遇到以下跨域请求问题:
- 最初在组件
OnInitializedAsync方法中使用BrowserRequestMode.NoCors发起请求,返回状态码200但内容为空 - 修改为
BrowserRequestMode.Cors并在服务端配置允许任意源、方法、头的CORS策略后,请求被拦截,提示目标资源无Access-Control-Allow-Origin头
初始请求代码
string URLString = "https://www.bnr.ro/nbrfxrates.xml"; var request = new HttpRequestMessage(HttpMethod.Get, URLString); request.SetBrowserRequestMode(BrowserRequestMode.NoCors); request.SetBrowserRequestCache(BrowserRequestCache.NoStore); HttpResponseMessage response = await Http.SendAsync(request); string xmlData = await response.Content.ReadAsStringAsync(); Console.WriteLine(xmlData);
修改后请求代码
string URLString = "https://www.bnr.ro/nbrfxrates.xml"; var request = new HttpRequestMessage(HttpMethod.Get, URLString); request.SetBrowserRequestMode(BrowserRequestMode.Cors); HttpResponseMessage response = await Http.SendAsync(request); string xmlData = await response.Content.ReadAsStringAsync(); Console.WriteLine(xmlData);
服务端Program.cs配置
builder.Services.AddCors(options => { options.AddPolicy("NewPolicy", builder => builder.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader()); }); ... app.UseCors("NewPolicy");
拦截提示
从源 'https://localhost:7271' 访问 'https://www.bnr.ro/nbrfxrates.xml' 被CORS策略阻止:请求的资源上不存在 'Access-Control-Allow-Origin' 头。如果不透明响应满足你的需求,请将请求模式设置为 'no-cors' 以禁用CORS获取资源。
dotnet.7.0.4.fmdigzwz3p.js:5 GET https://www.bnr.ro/nbrfxrates.xml net::ERR_FAILED 200 (OK)
问题根源
你配置的是自身服务端的CORS策略,但请求的目标站点 bnr.ro 并未将你的前端域名(https://localhost:7271)加入跨域白名单。浏览器的CORS验证逻辑是检查目标服务器返回的响应头,而非自身后端的配置,所以直接请求第三方站点必然会被拦截。
另外,NoCors模式下浏览器会返回不透明响应,这种响应无法读取内容,因此你会拿到空值。
解决方案:后端代理转发请求
通过自身后端作为中间层,代理请求第三方资源,前端直接请求后端接口,避免跨域问题:
1. 后端添加代理接口
在ASP.NET Core后端的控制器中新增接口,负责请求目标XML资源:
using Microsoft.AspNetCore.Mvc; using System.Net.Http; [ApiController] [Route("api/[controller]")] public class ProxyController : ControllerBase { private readonly HttpClient _httpClient; public ProxyController(HttpClient httpClient) { _httpClient = httpClient; } [HttpGet("bnr-rates")] public async Task<IActionResult> GetBnrRates() { var response = await _httpClient.GetAsync("https://www.bnr.ro/nbrfxrates.xml"); response.EnsureSuccessStatusCode(); var xmlContent = await response.Content.ReadAsStringAsync(); return Content(xmlContent, "application/xml"); } }
2. 前端修改请求目标
将前端请求改为指向自己的后端代理接口:
string URLString = "/api/proxy/bnr-rates"; var request = new HttpRequestMessage(HttpMethod.Get, URLString); HttpResponseMessage response = await Http.SendAsync(request); response.EnsureSuccessStatusCode(); string xmlData = await response.Content.ReadAsStringAsync(); Console.WriteLine(xmlData);
3. (可选)优化后端HttpClient配置
在后端Program.cs中配置HttpClient,避免重复创建:
builder.Services.AddHttpClient();
内容的提问来源于stack exchange,提问作者Radu Mihai
相关产品推荐
相关产品推荐

