• WebApi跨域问题


    用net core 2.1写的WebApi,然后出现了前端调用不了,百度说是浏览器同源策略(浏览器会阻止一个域的js和另一个域的js进行交互)

    然后写了一个测试用的WebApi,写了一个静态的html文件,打开发现是可以调用到WebApi中的方法的

    <!DOCTYPE html>
    
    <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="utf-8" />
        <title>跨域测试WebApi</title>
    </head>
    <body>
      请求数据:<div id="result"></div>
        <script src="C:Usersliusource
    eposCrosjquery.min.js" charset="utf-8"></script>
        <script type="text/javascript">
            $.ajax({
                type: "Get",
                data: {},
                url: "https://localhost:44342/api/CrosDomain/GetDomainData",
                success: function (result) {
                    $("#result").text(result);
                }
    
            })
        </script>
    </body>
    </html>
    namespace CrosDomain.Controllers
    {
        [Route("api/[controller]")]
        [ApiController]
        public class CrosDomainController : ControllerBase
        {
            [HttpGet]
            [Route("GetDomainData")]
            public string GetDomainData()
            {
                return Newtonsoft.Json.JsonConvert.SerializeObject(
                    new
                    {
                        id = 123,
                        Name = "Gakki",
                        Description = "这个Api就是专门用测试跨域问题的。。。"
                    }
                );
            }
        }
    }

    但是没有数据返回,会在页面报错

    接下来就是解决办法了

    第一种:通过后台模拟Http请求Api,将获取数据返回给前端

    首先新建一个mvc项目,然后在HomeController中添加一个方法

     
            [Route("GetCrossDaminData")]
            public string GetCrossDaminData()
            {
                string url = "https://localhost:44342/api/CrosDomain/GetDomainData";  //WebApi启动时的地址
                using (HttpClient httpClient = new HttpClient())
                {
                    HttpRequestMessage message = new HttpRequestMessage();
                    message.Method = HttpMethod.Get;
                    message.RequestUri = new Uri(url);
                    var result = httpClient.SendAsync(message).Result;
                    string content = result.Content.ReadAsStringAsync().Result;
                    return content;
                }
            }
        
    @{
        ViewData["Title"] = "Home Page";
    }
    
    <div class="text-center">
        <h1 class="display-4">Welcome</h1>
    </div>
    请求数据:<div id="result"></div>
    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script scr="" charset="utf-8"></script>
    <script type="text/javascript">
        $.ajax({
            type: "Get",
            data: {},
            url: "GetCrossDaminData",
            success: function (result) {
                $("#result").html(result);
            }
        })
    </script>
    // 这个home对应的index视图

    然后就出现下图,表示成功了

     第二种 在服务端指定允许你跨域

    在上面浏览器报错的有个提示   No 'Access-Control-Allow-Origin' header is present on the requested resourc

    所以可以在webapi的GetDomainData方法中加上一句代码即可

    base.HttpContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");

    然后打开静态页面,就会显示数据了。

    第三种 简单粗暴用中间件 用 Microsoft.AspNetCore.Cors包(可能版本有冲突,自行找合适的,我装的是Microsoft.AspNet.WebApi.Cors.tr     v5.2.7)

    然后再startup的ConfigureServices方法中注册服务

    services.AddCors(option => option.AddPolicy("AllowCors", _build => _build.AllowAnyOrigin().AllowAnyMethod()));

    在Configure添加到管道中

     app.UseCors("AllowCors");   //这个名称和前面注册服务的名字要一致,可能还有中间件的顺序也有关系,如果没有数据,可以调换一下位置

    然后打开静态页面也是一样的结构

    跨域问题解决还有很多方法,比如前端的jsonp,用标签<frame>,<img><script>等,不太熟,就不示例了,哈啊哈哈哈

  • 相关阅读:
    npropress进度条插件的使用
    让img图片像背景一样显示
    vue-cli3配置多页面入口
    7中漂亮的纯css字体
    速查手册
    推荐系统架构
    leetcode 172. 阶乘后的零
    C++ string和int互相转换
    特征分解
    线性代数基础
  • 原文地址:https://www.cnblogs.com/carlpeng/p/12736526.html
Copyright © 2020-2023  润新知