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 就会 运行 正常。
我在网络发布平台上托管了一个 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 就会 运行 正常。