3

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

Microsoft 和 Google 都返回 400 错误,我们自己的服务回复 400。Unity 指出在 UnityWebRequest 期间发生了“未知错误”。

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

"\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"

这就是请求正文的内容。如果我抓取字节(假设是 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 都是 true。

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

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

编辑:我在服务器上记录了内容类型,并且正确获取了 application/json,这表明大量数据正确到达。多个用户的身体数据也是相同的。Unity 可能只返回一个错误,因为服务器返回了 400。

4

2 回答 2

2

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

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

不过,我确实设法为它创建了一个解决方法/解决方案。似乎如果您在 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,因此我可以确认我从未连续两次弹出它。

于 2019-12-05T08:00:05.130 回答
0

此特定问题是由防病毒软件引起的。我们发现受影响的用户正在使用卡巴斯基防病毒软件,特别是在“流量处理”选项卡下的一个名为“将与网站交互的脚本集成到流量中”的功能。我不知道为什么卡巴斯基认为这是一个合理的做法,我想它不仅会破坏我们的游戏,但它确实存在。用户只需在 Kaspersky 中禁用该选项,UnityWebRequest 将正常运行。

于 2019-12-06T01:02:43.730 回答