You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:23:12