我有一个托管在网络发布平台上的 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。