stevenjin 2024-11-30 00:05 采纳率: 96.8%
浏览 58
已结题

用asp.net core api运行api时在uniapp如何配置跨域


目的,运行本地api服务器,将本地设备数据推送到微信小程序或uniApp。正式环境遇到了跨域问题。以下是解决思路:

1.根据uniapp介绍:
**程序中使用uniCloud
各家小程序平台,均要求在小程序管理后台配置小程序应用的联网服务器域名,否则无法联网。

使用uniCloud后,开发者将不再需要自己购买、备案域名,直接将uniCloud的域名填写在小程序管理后台即可。(如需使用前端网页托管仍需进行域名备案)**

2.注册了uniCloud,看到了阿里云提供的request域名、上传、下载域名。并分别将其填写到了微信小程序的服务器域名当中。
阿里云看到的request域名:https://api.next.bspapp.com 

3.在asp.net core mvc的program中进行了域名配置
```c#
string[] urls = new[] { "https://api.next.bspapp.com:5091" };
// 注册跨域服务到容器中
// 注册跨域服务到容器中
     builder.Services.AddCors(options =>
     options.AddDefaultPolicy(builder => builder.WithOrigins(urls)
     .AllowAnyMethod().AllowAnyHeader().AllowCredentials()));
             var app = builder.Build();

4:uniApp中用'/api/WeatherForecast'请求,有响应success,但不能进入本地webapi服务器的WeatherForecast方法中

//mvc中的配置
 public static void Main(string[] args)
 {
     var builder = WebApplication.CreateBuilder(args);

     // Add services to the container.

     builder.Services.AddControllers();
     // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
     builder.Services.AddEndpointsApiExplorer();
     builder.Services.AddSwaggerGen();

   
     string[] urls = new[] { "https://api.next.bspapp.com" };
     // 注册跨域服务到容器中
     builder.Services.AddCors(options =>
     options.AddDefaultPolicy(builder => builder.WithOrigins(urls)
     .AllowAnyMethod().AllowAnyHeader().AllowCredentials()));
             var app = builder.Build();

     // Configure the HTTP request pipeline.
     if (app.Environment.IsDevelopment())
     {
         app.UseSwagger();
         app.UseSwaggerUI();
     }

     app.UseCors();

     app.UseAuthorization();


     app.MapControllers();

     app.Run();
 }

//在uniapp的mainfest.json中配置跨域
"devServer" : {
        "proxy" : {
            "/api" : {
                "target" : "https://api.next.bspapp.com",
                "changeOrigin" : true,
                "ws" : true,
                "secure" : false
            }
        }
    },
    "h5" : {
        "template" : "index.html",
        "title" : "自测项目",
        "devServer" : {
            "disableHostCheck" : false,
            "proxy" : {
                "/api" : {
                    "target" : "https://api.next.bspapp.com/", //请求的目标域名  
                    "changeOrigin" : true,
                    "secure" : false,
                    "pathRewrite" : {
                        "^/api" : ""
                    }
                }
            },
            "port" : 5091,
            "https" : false
        },
        "router" : {
            "mode" : "hash"
        },
        "domain" : "",
        "optimization" : {
            "treeShaking" : {
                "enable" : true
            }
        }
    }

//uniApp中发起请求
                uni.request({
                  url: '/api/WeatherForecast', // 请求的url
                  method: 'GET',
                  success: (res) => {
                      uni.showToast({
                           title:"ok"
                      })
                      uni.showToast({
                          title:res.data[0].summary
                      })                
                  },
                  fail: (err) => {
                    uni.showToast({
                        title:err.errMsg
                    })
                  }
                })
  • 写回答

2条回答 默认 最新

  • wanghui0380 2024-12-02 11:41
    关注

    发了2贴,那边给钱一堆机器人我就不参合了。这边安静,我来回答一下
    你2贴都没有说清楚一件事,那就是你在里面起什么作用。
    为啥要讨论你在里面起啥作用呢?因为跨域实际是个浏览器术语。
    如果你请求的url的那个服务器,标记我不希望非规则内的人访问,浏览器会检查者头部规则,当他发现当前地址和访问地址规则不对,他停止访问并发出跨域警告。

    也就是说如果不是浏览器访问,你完全可以不检查,也不停止访问并发出警告。
    所以这里就需要明确你自己在整套过程里的位置。

    1.你是代理访问,你用httpclient访问,他不存在检查。不过你可能会把内容发送给你自己的浏览器客户端,这个内容头上也许会带原服务器的规则申明,导致浏览器认为跨域。这种情况你可以修改对方response的头部信息,移除规则。比如如果我用nginx,你会发现有使用nginx修改跨域规则或者增加跨域规则的例子
    2.你啥都没干,你只是提供了一个网站A,然后你的前端程序员使用你A的页面,在浏览器里访问B。此时浏览器说跨域了。
    那么你前面发了一堆说明,这个说明是什么呢?这个说明其实就是对方告诉你,如何把你网站A加入到他服务器的允许跨域的列表里。你需要填入你的网站A的域名。他的B服务器在response的时候把允许A跨域的列表加入到规则里放回

    所以回到开头,你需要明白你自己在整套机制里的位置,你自己需要回答一下,“我在这里面干了啥”

    最后,我们看一下,你代码的含义

    string[] urls = new[] { "https://api.next.bspapp.com:5091" };
    // 注册跨域服务到容器中
    builder.Services.AddCors(options =>
    
    

    这代码的意思是:允许https://api.next.bspapp.com:5091访问你的A URL,而不是允许你访问人家的。
    说白了,就是你只能控制你自己的,不能能控制别人的,你这里控制的是允许别人访问你。
    如果服务是别人的,你要么按他的规则方案,要么请对方把你加入。要么中间加代理,并在代理修改访问规则。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    1人已打赏
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月13日
  • 已采纳回答 12月5日
  • 修改了问题 12月3日
  • 修改了问题 12月3日
  • 展开全部