You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 03:39:56