Unity WebGL请求Http接口出现的Cors跨域问题

1.运行环境

(1)WebGL运行浏览器:Firfox Quantum 67.0(64位)跨域

(2)服务端API运行环境:IIS,.Net Core 2.1 API浏览器

 

2.问题:CORS 头缺乏Access-Control-Allow-Origin

问题缘由:因为浏览器的同源策略(了解同源策略详见文章结尾的参考资料),不一样源(不一样域名)之间的交互是受限的,即跨域访问服务器

解决方案:使用 CORS 容许跨源访问app

在.Net Core 2.1 API项目的Startup.cs中设置跨域容许访问的域名:cors

1 public void ConfigureServices(IServiceCollection services)
2 {
3    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
4    // 跨域,容许全部域名访问
5    services.AddCors(options => options.AddPolicy("AllowCorsDomain", p => p.WithOrigins("*")
6             .AllowAnyMethod()
7             .AllowAnyHeader()
8             .AllowCredentials()));
9 }
1 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
2 {
3   if (env.IsDevelopment())
4   {
5     app.UseDeveloperExceptionPage();
6   }
7   app.UseMvc();
8   app.UseCors("AllowCorsDomain");
9 }

 

3.问题:不容许有多个 'Access-Control-Allow-Origin' CORS 头

WebGL请求Http有两种方式,分别位WWWUnityWebRequest。经过两种方式分别在Firefox浏览器中进行访问,都会出现程序中没法获取到数据的问题。经过监测发现,浏览器的HTTP请求是正常的,数据返回也正常,可是因为返回数据表头中有两个Access-Control-Allow-Origin字段,而致使WebGL没法解析到数据。测试

正常来讲,服务器返回的数据表头是只包含一个Access-Control-Allow-Origin字段的,那么多余的一个是怎么来的呢?经过进一步测试发现,WebGL中的两种HTTP请求方式在请求数据发送的表头中都包含有一个Origin字段,服务器返回的数据中也包含了这一个,故会返回两个Access-Control-Allow-Originui

在测试中,经过删除请求头中的Origin字段,发现请求一切正常。可是,在Unity中,WWWUnityWebRequest两种请求方式都是封装好的,默认带了Origin字段,因此是没法删除Origin字段的,所以在Unity中暂时没法解决该问题spa

既然在Unity中没法解决该问题,那么只能在服务器端尝试解决。.net

在不断尝试各类办法无效后,发如今服务器端IIS中,有个HTTP响应标头,打开一看,是关于服务器端数据包表头的设置,OK,删掉Access-Control-Allow-Origin的,这样服务器将不会再返回Access-Control-Allow-Origin信息,问题解决。code

 

 4.参考资料

(1)启用 ASP.NET Core 中的跨域请求 (CORS)

(2)浏览器的同源策略

(3)WebGL在Firefox浏览器中已拦截跨源请求(CORS 头缺乏)的解决方法(服务器为IIS)

相关文章
相关标签/搜索