.Net中跨域问题

.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();
    }
}

需要设置跨域

csharp 复制代码
var 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("*"));
});
相关推荐
江沉晚呤时3 小时前
在 C# 中调用 Python 脚本:实现跨语言功能集成
python·microsoft·c#·.net·.netcore·.net core
Oberon4 小时前
Avalonia硬配.NET Framework 4.8
c#·.net·avalonia·.net framework
xiaopengbc5 小时前
MSVCP*.dll、vcruntime*.dll缺失或损坏,以及.NET Framework相关问题,解决办法
.net
xiaopengbc5 小时前
.NET Framework 安装失败及异常情况 常用处理方法
.net·.net修复
专注VB编程开发20年17 小时前
C# VB.NET多进程-管道通信,命名管道(Named Pipes)
开发语言·c#·.net
百锦再17 小时前
Rider 全面解析:跨平台 .NET IDE 的核心技术与高效实践指南
linux·ide·.net·sdk·core·rider
mit6.82417 小时前
[Subtitle Edit] 字幕格式处理 | .Net依赖管理(NuGet)
.net
唐青枫19 小时前
C#.NET 泛型详解
c#·.net
步、步、为营1 天前
.net服务器Kestrel 与反向代理
运维·服务器·.net