.Net中跨域问题
HTML页面
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Cors</title>
</head>
<body>
<button onclick="handlerClick()">跨域请求</button>
<p id="response"></p>
</body>
<script>
const response = document.getElementById("response")
const handlerClick = async () => {
const responseText = (await fetch("http://localhost:5050/WeatherForecast")).json()
responseText.then(data => {
response.innerHTML = JSON.stringify(data)
})
}
</script>
</html>
跨域设置
全局配置跨域
csharp
namespace Bunny.Cors.Net;
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// TODO 先处理跨域之后再访问控制器
var serviceCollection = builder.Services;
serviceCollection.AddCors(options =>
{
options.AddPolicy("BunnyApiCors", policyBuilder =>
{
policyBuilder.WithOrigins("*")
.WithHeaders("*")
.WithMethods("*");
});
});
serviceCollection.AddControllers();
serviceCollection.AddEndpointsApiExplorer();
serviceCollection.AddSwaggerGen();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
// TODO 使用跨域中间件
app.UseCors("BunnyApiCors");
app.UseAuthorization();
app.MapControllers();
app.Run();
}
}
需要设置跨域
csharpvar serviceCollection = builder.Services; serviceCollection.AddCors(options => { options.AddPolicy("BunnyApiCors", policyBuilder => { policyBuilder.WithOrigins("*") .WithHeaders("*") .WithMethods("*"); }); });
使用跨域中间件
csharp// TODO 使用跨域中间件 app.UseCors("BunnyApiCors");
属性跨域
配置跨域
csharp
namespace Bunny.DestinationNode.Net;
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// TODO 先处理跨域之后再访问控制器
var serviceCollection = builder.Services;
serviceCollection.AddCors(options =>
{
options.AddPolicy("BunnyApiCors", policyBuilder =>
{
policyBuilder.WithOrigins("*")
.WithHeaders("*")
.WithMethods("*");
});
});
serviceCollection.AddControllers();
serviceCollection.AddEndpointsApiExplorer();
serviceCollection.AddSwaggerGen();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
// TODO 使用跨域中间件
app.UseCors();
app.UseAuthorization();
app.MapControllers();
app.Run();
}
}
控制器上操作
[EnableCors("BunnyApiCors")]
这个操作也可以在方法上使用。
csharp
[ApiController]
[Route("[controller]/")]
[EnableCors("BunnyApiCors")]
public class BunnyController : ControllerBase
{
[HttpGet("GetBunny")]
public string GetBunny()
{
return "bunny111";
}
}
在方法上使用
csharp
[ApiController]
[Route("[controller]/")]
public class BunnyController : ControllerBase
{
[HttpGet("GetBunny")]
[EnableCors("BunnyApiCors")]
public string GetBunny()
{
return "bunny111";
}
}
如果在类上使用了[EnableCors("BunnyApiCors")]
,但是某些方法不希望跨域可以这样。
在方法上使用注解[DisableCors]
csharp
[HttpGet("GetBunny/Disable")]
[DisableCors]
public string GetBunnyDisable()
{
return "bunny111";
}
默认策略
csharp
var builder = WebApplication.CreateBuilder(args);
var serviceCollection = builder.Services;
// TODO 先处理跨域之后再访问控制器
serviceCollection.AddCors(options =>
{
options.AddDefaultPolicy(policyBuilder => policyBuilder.WithOrigins("*")
.WithHeaders("*")
.WithMethods("*"));
});
serviceCollection.AddControllers();
serviceCollection.AddEndpointsApiExplorer();
serviceCollection.AddSwaggerGen();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
// TODO 使用跨域中间件
app.UseCors();
app.UseAuthorization();
app.MapControllers();
app.Run();
需要指定默认策略
AddDefaultPolicy
csharp// TODO 先处理跨域之后再访问控制器 serviceCollection.AddCors(options => { options.AddDefaultPolicy(policyBuilder => policyBuilder.WithOrigins("*") .WithHeaders("*") .WithMethods("*")); });