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");