【问题标题】:Unity WebGL UnityWebRequest Bad Body DataUnity WebGL UnityWebRequest 错误的正文数据
【发布时间】:2019-12-05 01:47:57
【问题描述】:

我有一个托管在网络发布平台上的 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,这表明大量数据正确到达。多个用户的身体数据也是相同的。由于服务器返回 400,Unity 可能只返回错误。

【问题讨论】:

    标签: c# unity3d unity-webgl unitywebrequest


    【解决方案1】:

    我一直在与完全相同的错误作斗争。使用我的应用程序的客户很少收到 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,因此我可以确认我从未连续两次弹出它。

    【讨论】:

    • 非常有趣!我的也是一个 POST 请求。这是否只影响您的游戏的 webgl 副本,或者独立构建也会受到影响(假设您也在使用 Unity)?我会试一试并报告。谢谢
    • 哦,对不起,我的意思是我的不使用上传处理程序。我没有 webgl 副本,我有使用 Unity 的 android/ios 构建。我很确定它与 UnityWebRequest 有关,但找不到任何官方来源。
    • 我们最终找到了问题的根源,所以听起来我们可能遇到了不同的问题。很高兴听到您的解决方案对您有用,并感谢您查看此问题 :)
    • 当时听起来确实有些不同。很高兴听到您设法解决它
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 1970-01-01
      • 2018-12-20
      相关资源
      最近更新 更多