仅Unity WebGL构建发送Web请求时出现连接错误
Unity WebGL 连接ASP.NET登录API失败排查与解决
问题场景
Unity WebGL客户端向同一系统的ASP.NET登录API发送Post请求时,立即弹出连接错误,但API控制台无任何报错;该功能在Unity编辑器和桌面构建版本中可正常运行,已配置CORS但问题未解决。
排查与解决步骤
1. 移除客户端不必要的CORS请求头
Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers是服务器响应头,客户端请求时添加这些头会干扰浏览器的预检流程,直接删除以下代码:
// 删掉这三行无效的请求头设置 apiRequest.SetRequestHeader("Access-Control-Allow-Origin", "*"); apiRequest.SetRequestHeader("Access-Control-Allow-Methods", "*"); apiRequest.SetRequestHeader("Access-Control-Allow-Headers", "*");
修改后的客户端请求代码:
using(UnityWebRequest apiRequest = UnityWebRequest.Post(uri, jsonRequest, "application/json")){ yield return apiRequest.SendWebRequest(); //apiRequest returns a token on successful authentication if (apiRequest.result > UnityWebRequest.Result.Success){ Debug.Log("API Request: " + apiRequest.result); loginPending = false; yield break; } else if (apiRequest.downloadHandler.text.ToLower() == "invalid credentials"){ Debug.Log("Login failed"); loginPending = false; yield break; } else token = apiRequest.downloadHandler.text; }
2. 调整ASP.NET中间件顺序
确保UseCors在UseAuthorization和MapControllers之前,本地开发时可暂时注释UseHttpsRedirection(避免HTTP转HTTPS导致预检请求失败):
var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { } // 本地开发可先注释此行,测试通过后再恢复HTTPS重定向 // app.UseHttpsRedirection(); // UseCors必须在UseAuthorization和MapControllers之前执行 app.UseCors("WebGLOrigins"); app.UseAuthorization(); app.MapControllers(); app.Run();
3. 查看浏览器控制台的具体错误信息
WebGL的跨域错误细节需在浏览器开发者工具(F12)中查看:
- 打开
Network标签,筛选XHR请求,查看登录请求的状态码和响应头 - 打开
Console标签,查看具体的CORS错误提示(如预检请求失败、来源不被允许等)
4. 确认WebGL的请求URI与运行环境
- 若直接本地打开WebGL的
index.html(file://协议),浏览器会限制跨域请求,需将WebGL部署到本地服务器(如IIS、Unity自带的WebGL本地测试服务器) - 确认请求URI是否正确,避免编辑器中使用
localhost但WebGL构建后因环境变化导致地址无效
5. 简化CORS配置避免冲突
全局已配置CORS策略,可删除控制器上的[EnableCors("WebGLOrigins")]属性,避免局部与全局策略冲突:
// 移除控制器上的EnableCors属性 [HttpPost("login")] public string Post([Required] LoginCreds loginCreds){ loginCreds.playerName = loginCreds.playerName.ToLower(); //MAKE SURE TO SET USER OFFLINE WHEN LOGGED OUT OR DISCONNECTED SqlConnection sqlConn = _playerService.SqlOpen(); if (_playerService.IsUserOnline(sqlConn, loginCreds.playerName)) return "User already Online"; //sanitize user input before authenticating login creds (bool, string) authenticateResult = _playerService.LdapAuthenticate(loginCreds.playerName, loginCreds.playerPass); if(authenticateResult.Item1) _playerService.SendTokenToDB(loginCreds.playerName, authenticateResult.Item2); Console.WriteLine("LDAP API service finished"); return authenticateResult.Item2; }
6. 验证API的预检请求响应
用Postman或curl发送OPTIONS请求到API的/login路径,检查响应头是否包含以下内容:
Access-Control-Allow-Origin: * Access-Control-Allow-Methods: POST, OPTIONS Access-Control-Allow-Headers: Content-Type
若响应中没有这些头,说明CORS策略未正确生效,需重新检查ASP.NET的服务注册与中间件顺序。
内容的提问来源于stack exchange,提问作者Myosotis
相关产品推荐
相关产品推荐

