【发布时间】:2018-10-01 09:39:54
【问题描述】:
我正在使用来自 HTTPS 的 UnitywebRequest 方法下载 Assetbundles,但是 UnityWebRequest.SendWebRequest 似乎花了不少时间才能真正开始接收任何数据。
public static IEnumerator DownloadMenuAssetBundle(string fileName)
{
string path = Path.Combine(Globals.Platform, fileName);
UnityWebRequest www = new UnityWebRequest(FileManager.RequestFile(path));//this returns the complete url to the bundle e.g https://mywebsite.com/unity/myBundle
www.downloadHandler = new DownloadHandlerBuffer();
www.SendWebRequest();
while (!www.isDone)
{
Debug.Log("response: " + www.responseCode);
if (www.isNetworkError)
{
Debug.Log(www.error);
}
Debug.Log("downloaded:" + www.downloadedBytes);
yield return null;
}
Debug.Log("downloaded bytes: " + www.downloadedBytes);
Debug.Log("final response:" + www.responseCode);
if (www.error != null)
{
Debug.LogError("Encountered error while downloading: <color=blue>" + fileName + "</color>: " + www.error);
}
else
{
//rest of the logic, this works
}
Debug.Log("response: " + www.downloadedBytes); 将在随机的时间内返回0(有时从几分钟到几分钟不等)。但是www. isNetworkError 永远不会被命中,一旦开始接收字节,它将在几毫秒内下载整个内容。
以前我在 http 服务器上使用完全相同的脚本,它运行完美,没有任何延迟,但是一旦我切换到 https,它开始需要一段时间。延迟也不会发生在编辑器中(Unity 版本 2017.2.1f1 运行时版本 .net 3.5,具有 2.0 子集 api 兼容性),但会发生在我所有的移动设备(一加 3、三星 Galaxy s8、三星 Galaxy s6)上。
起初www.responseCode 返回了301 Moved Permanently,我通过使用新的 https url 而不是 http url 解决了这个问题,希望这能解决它。然而它没有,现在我只得到200 OK。
这也是一个不一致的问题,因为它所花费的时间并不相同,甚至也不会一直发生(但大部分时间都会发生)
这可能是安全层花费额外时间或服务器花费时间响应的问题吗?如果这是问题所在,我将如何追踪它(尽管我对此表示怀疑,因为它在编辑器中运行良好)?
编辑:解决方法
我通过使用WWW 类而不是UnityWebRequest 解决了这个问题。延迟现在完全消失了,但没有进行 SSL 证书验证,因为 Unity 似乎默认拒绝它们。我不会真正称其为修复程序,但现在可以使用。
【问题讨论】:
-
从
while循环中删除if (www.isNetworkError)。您应该只在循环完成后和循环之外执行此操作。如果出现错误,循环应该立即退出。 -
我刚看到你的编辑。您是否有要在请求期间验证的 SSL 证书?
-
@Programmer 是的,如果可能的话。我不得不说,到目前为止,我还没有时间彻底调查/调查它。但假设我必须使用 x509 创建证书存储?
-
我怀疑。请注意完全确定,但您可以使用
UnityWebRequest.certificateHandler看看会发生什么。 This 显示如何验证证书。您还可以查看我的other,这也是使用WebRequest在Android 上减慢UnityWebRequest的解决方案 -
您好,您能告诉我如何使用 www 类发送 post 请求吗?现在找不到任何过时的文档
标签: android unity3d webrequest assetbundle