zoukankan      html  css  js  c++  java
  • ASP.Net Core Web API解决跨域问题

    一、跨域问题的原由

    跨域问题是由浏览器的同源策略引起的,是指协议、域名、端口有一个不一样,那么就形成了跨域。更详细的介绍可以参考jQuery jsonp跨域请求

    二、跨域问题的解决

    1、使用JSONP

    JSONP是通过使用特殊的HTML标记来请求跨域资源的,适用于前端开发。可以参考jQuery jsonp跨域请求

    2、后台模拟HTTP请求

    将跨域问题转移到服务端处理,在服务端请求不同源的API接口。

    public class HomeController : Controller
    {
        [HttpGet]
        public string GetCrossDomainData()
        {
            return InvokeApi("http://localhost:5000/api/crossdomain/getdata");
        }
    
        private static string InvokeApi(string url)
        {
            using (var httpClient = new HttpClient())
            {
                var message = new HttpRequestMessage()
                {
                    Method = HttpMethod.Get,
                    RequestUri = new Uri(url)
                };
                var result = httpClient.SendAsync(message).Result;
                var content = result.Content.ReadAsStringAsync().Result;
                return content;
            }
        }
    }

    3、在服务器端指定允许跨域

    (1) 在控制器API中允许跨域

    [HttpGet]
    [Route("GetData")]
    public IActionResult GetData()
    {
        //允许跨域请求
        HttpContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
        
        return new JsonResult(new
        {
            Id = "100",
            Data = "CrossDomainData"
        });
    }

    (2) 使用IActionFilter标记允许跨域

    可以在API方法或者控制器中使用IActionFilter标记,前者仅对当前方法生效,后者对整个控制器的方法都生效。

    public class CrossDomainActionFilterAttribute : Attribute, IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            //允许跨域请求
            context.HttpContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
        }
    }
    [HttpGet]
    [Route("GetData")]
    [CrossDomainActionFilterAttribute]
    public IActionResult GetData()
    {
        //允许跨域请求
        //HttpContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
        
        return new JsonResult(new
        {
            Id = "100",
            Data = "CrossDomainData"
        });
    }
    [Route("api/[controller]")]
    [ApiController]
    [CrossDomainActionFilter]
    public class CrossDomainController : ControllerBase
    {
    }

    4、使用CORS中间件

    CORS中间件是微软提供的跨域支持类库,可使用Nuget引入Microsoft.AspNetCore.Cors类库。

    (1) 注册跨域请求服务

    //注册跨域请求CORS服务
    services.AddCors(options =>
    {
        options.AddPolicy("AllowCors", builder =>
        {
            builder.AllowAnyOrigin().AllowAnyMethod();
        });
    });

    (2) 启用Cors中间件

    //启用Cors中间件
    app.UseCors("AllowCors");
  • 相关阅读:
    hadoop安装前的准备
    记录一次Qt5程序无法运行的解决过程
    C#里的Thread.Join与Control.Invoke死锁情况
    qbxt7月笔记
    zhxのDP讲
    有n*m的方格图
    最长上升子序列相关问题笔记
    qbxt游记(清北澡堂划水记
    DAZの七下道法(持续更新
    模板
  • 原文地址:https://www.cnblogs.com/xhubobo/p/14435708.html
Copyright © 2011-2022 走看看