ASP.NET网站开发之“跨域”
在 ASP.NET 网站开发中,跨域问题(CORS,Cross-Origin Resource Sharing)是由于浏览器的同源策略限制导致的 —— 当前端页面(如 http://localhost:3000)请求不同协议、域名、端口的后端接口(如 http://localhost:5000)时,浏览器会拦截请求并抛出跨域错误。以下是 ASP.NET (含 Framework 和 Core)中最常用、最规范的跨域解决方案,按优先级和实用性排序:
一、核心概念:先明确跨域的触发条件
跨域请求需同时满足以下 3 点(缺一不可):
- 协议不同(如 http vs https);
- 域名不同(如 localhost vs 127.0.0.1,a.com vs b.com);
- 端口不同(如 8080 vs 5000)。
浏览器会先发送 OPTIONS 预检请求(复杂请求,如 POST 带 JSON 数据、自定义请求头),验证后端是否允许跨域;简单请求(如 GET 无自定义头)直接发送,但仍受同源策略限制。
二、ASP.NET Core (推荐,.NET Core 2.0+)
ASP.NET Core 内置了 CORS 中间件,配置简单且灵活,是首选方案。
步骤 1:安装依赖(默认已包含,无需额外安装)
Microsoft.AspNetCore.Cors 是 Core 框架自带的,只需在 Startup.cs 或 Program.cs 中配置即可。
步骤 2:配置 CORS 策略(两种写法:Program.cs/ Startup.cs)
方式 1:.NET 6+ (Program.cs 顶级语句)
var builder = WebApplication.CreateBuilder(args);// 1. 添加 CORS 服务,并定义策略(PolicyName 自定义,如 "AllowAll" 或 "SpecificOrigins")
builder.Services.AddCors(options =>
{options.AddPolicy("AllowAll", policy =>{// 允许所有源(开发环境可用,生产环境不推荐)policy.AllowAnyOrigin().AllowAnyMethod() // 允许所有 HTTP 方法(GET/POST/PUT/DELETE 等).AllowAnyHeader(); // 允许所有请求头});// 生产环境推荐:仅允许指定源(精准授权)options.AddPolicy("SpecificOrigins", policy =>{policy.WithOrigins("http://localhost:3000", "https://your-frontend-domain.com") // 允许的前端域名(不带 /).AllowMethods("GET", "POST", "PUT") // 仅允许指定方法.AllowHeaders("Content-Type", "Authorization") // 仅允许指定请求头.AllowCredentials(); // 允许携带 Cookie(如需跨域传递身份凭证)});
});// 其他服务注册(如 AddControllers、AddDbContext 等)
builder.Services.AddControllers();var app = builder.Build();// 2. 启用 CORS 中间件(必须放在 UseRouting 之后、UseAuthorization 之前!)
app.UseCors("SpecificOrigins"); // 指定使用的策略名称// 其他中间件(如 UseRouting、UseAuthorization、Ma
