• .Net中跨域问题


    .Net中跨域问题

    HTML页面

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Corstitle>
    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>
    

    跨域设置

    全局配置跨域

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

    需要设置跨域

    var serviceCollection = builder.Services;
    serviceCollection.AddCors(options =>
    {
        options.AddPolicy("BunnyApiCors", policyBuilder =>
        {
            policyBuilder.WithOrigins("*")
                .WithHeaders("*")
                .WithMethods("*");
        });
    });
    

    使用跨域中间件

    // TODO 使用跨域中间件
    app.UseCors("BunnyApiCors");
    

    属性跨域

    配置跨域
    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")]这个操作也可以在方法上使用。

    [ApiController]
    [Route("[controller]/")]
    [EnableCors("BunnyApiCors")]
    public class BunnyController : ControllerBase
    {
        [HttpGet("GetBunny")]
        public string GetBunny()
        {
            return "bunny111";
        }
    }
    

    在方法上使用

    [ApiController]
    [Route("[controller]/")]
    public class BunnyController : ControllerBase
    {
        [HttpGet("GetBunny")]
        [EnableCors("BunnyApiCors")]
        public string GetBunny()
        {
            return "bunny111";
        }
    }
    

    如果在类上使用了[EnableCors("BunnyApiCors")],但是某些方法不希望跨域可以这样。

    在方法上使用注解[DisableCors]

    [HttpGet("GetBunny/Disable")]
    [DisableCors]
    public string GetBunnyDisable()
    {
        return "bunny111";
    }
    

    默认策略

    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

    // TODO 先处理跨域之后再访问控制器
    serviceCollection.AddCors(options =>
    {
        options.AddDefaultPolicy(policyBuilder => policyBuilder.WithOrigins("*")
            .WithHeaders("*")
            .WithMethods("*"));
    });
    
  • 相关阅读:
    Python 与 C++ 的进程通信
    安全浏览器是否可以直接“回击”浏览器主页劫持?
    LeetCode 单周赛309 && LeetCode双周赛86 && AcWing周赛67
    小红书电商运营实战课,从0打造全程实操(65节视频课)
    torchnet简介
    【面试】软件自动化测试岗位面试题和答案
    redis的缓存更新策略
    7.MMD 法线贴图的设置与调教
    Matplotlib面向对象接口
    《数据在外设中的存储》
  • 原文地址:https://blog.csdn.net/weixin_46533577/article/details/139322723