Unity WebGL UnityWebRequest 错误 Body 数据

Unity WebGL UnityWebRequest Bad Body Data

我在网络发布平台上托管了一个 Unity 游戏。此游戏连接到多个 API,包括 Microsoft PlayFab、Google Analytics 和我们自己的后端服务器。有时(非常罕见,不到 0.1% 的时间)游戏无法连接到任何这些服务,我不确定为什么。我从来没有能够在本地复制这个。由于其稀有性,我们目前无法将其隔离到特定区域。它似乎影响特定 computers/households。同一台计算机上的多个浏览器 运行 游戏将以同样的方式失败。有时同一家庭的多台电脑也会受到影响。

Microsoft 和 Google 都 return 400 错误,我们自己的服务回复 400。Unity 指出 'Unknown Error' 在 UnityWebRequest 期间发生。

我无法通过 Microsoft 或 Google 查看数据 sent/received,但我可以查看我们自己的服务器日志,但事情变得很奇怪。 UnityWebRequest 正在进入我们的服务,该服务托管在 AWS 上并由 CloudFlare 代理。 URL 是正确的,但请求 body 似乎完全奇怪:

"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000xך\u0000\u0000\u0000\u0000\u0000`ך\u0000�\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`ך\u0000!\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"

这就是请求的内容body。如果我抓取字节(假设是 UTF8 编码的字符串),那么我会得到以下内容:

byte[72] { 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 120, 215, 154, 0, 0, 0, 0, 0, 96, 215, 154, 0, 239, 191, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 215, 154, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }

我的第一个猜测是 AWS/CloudFlare/Google 可能被某些防火墙或区域阻止了,但如果是这种情况,我不希望有任何东西进入我们自己的 AWS 服务器进行分析。所以现在我不确定...

这里是相关的 Unity (2018.2.21f1) 代码:

UnityWebRequest www = UnityWebRequest.Post(uri, body);
UploadHandlerRaw uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(body));
uploadHandler.contentType = "application/json";
www.uploadHandler = uploadHandler;
www.SetRequestHeader("Content-Type", "application/json");

yield return www.Send();

if (www.isNetworkError || www.isHttpError)
{
    Log(ELoggingLevel.Error, "Error while sending data: [{0}]", www.error);
}
else
{
    var contents = www.downloadHandler.text;
    // do useful stuff here
}

记录器会触发,因此 isNetworkError 或 isHttpError 为真。

[错误]:发送数据时出错:[未知错误]

有人对发生的事情有任何想法吗?有没有人认识到服务器记录的数据?看来我的 Unity 游戏只是在某种罕见情况下拒绝发送任何类型的合理数据。

编辑:我在服务器上记录了内容类型,并且正确地得到了 application/json,这表明大量数据已正确到达。 body 数据在多个用户中也是相同的。 Unity 可能只是 return 出错,因为 400 被服务器 return 编辑。

我一直在为完全相同的错误而苦苦挣扎。使用我的应用程序的客户很少收到 400 或未知错误。在本地我无法重现这一点。然而,它不是通过上传,而是通过几个(不同的)post 请求。 我和你一样使用不同的服务器提供商。

我试图寻找原因(和答案),但始终找不到。

虽然我确实设法为它创建了一个解决方法/解决方案。似乎如果你在 0.1 秒后执行相同的动作,它就会毫无问题地通过。所以我建议实施如下内容。

int tryCounts = 3;

for (int i = 0; i < tryCounts; i++)
{
    UnityWebRequest www = UnityWebRequest.Post(uri, body);
    UploadHandlerRaw uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(body));
    uploadHandler.contentType = "application/json";
    www.uploadHandler = uploadHandler;
    www.SetRequestHeader("Content-Type", "application/json");

    yield return www.Send();

    if (www.isNetworkError || www.isHttpError)
    {
        Log(ELoggingLevel.Error, "Error while sending data: [{0}]", www.error);
        yield return new WaitForSecondsRealtime(0.15f); 
    }
    else
    {
        var contents = www.downloadHandler.text;
        // do useful stuff here
        break;
    }
}

这个简单的解决方案解决了我所有的问题。我仍然不时地在我的数据库错误日志中看到未知错误弹出。因为我也记录了 trycount,我可以确认我从来没有让它连续弹出两次。

此特定问题是由防病毒软件引起的。我们发现受影响的用户正在使用卡巴斯基反病毒软件,特别是 'Traffic Processing' 选项卡下名为 'Integrate script for interaction with websites into traffic' 的功能。我不知道为什么 Kaspersky 认为这是一件合理的事情,我想它一定不仅仅破坏了我们的游戏,但确实如此。用户只需在 Kaspersky 中禁用该选项,UnityWebRequest 就会 运行 正常。