使用UnityWebRequest的响应代码为0的通用/未知HTTP错误

Kot*_*ovP 5 http unity-game-engine unity-webgl

我试图使用一些服务器的API函数,突然出现了这个错误.我将在代码示例后解释它:

public IEnumerator Post(Dictionary<string, string> data)
    {
        var request = UnityWebRequest.Post(Url, data);
        request.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");

        yield return request.Send();

        if (request.isError)
           UpdateNetworkLog("Network error has occured: " + request.error);
        else
            // Some code after success
    }
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,主要是我把它从Unity手动考虑POST请求这里.但是,有一个问题 - 请求从未正确完成,它总是有错误(使用UpdateNetworkLog函数显示):"通用/未知HTTP错误",而请求的响应代码为0.此外,我试图使用遗留本手册中的方法和WWW类获得相同的结果.

我认为,问题在于Unity如何获得响应:我通过Wireshark检查了数据包,我的POST请求和服务器的响应都非常好,没有错误或错误.

另一个重要的问题是我正在使用WebGL,并且编辑器中的所有内容都可以,程序得到正确的响应并正常工作; 只有在浏览器中构建并运行游戏(在Chrome和Safari中测试)后才会出现错误.此外,尝试使用Unity WebGL播放器启动它,但XAMPP:相同.

感谢所有未来的回复,因为Google对此一无所知.

小智 5

潜在解决方案1

Unity文档中了解如何UnityWebRequest与WebGL 一起使用:

WebGL支持WWW和UnityWebRequest类。它们使用JavaScript中的XMLHttpRequest类通过浏览器处理WWW请求来实现。这对访问跨域资源施加了一些安全限制。基本上,对服务器的任何WWW请求(不同于承载WebGL内容的服务器)都需要由您尝试访问的服务器授权。要访问WebGL中的跨域WWW资源,您要访问的服务器需要使用CORS对此进行授权。

我的最佳猜测是,您尝试访问的服务器没有正确设置或配置CORS。当您的代码在浏览器中运行时,浏览器本身正在处理请求,因此将您的代码置于该浏览器的安全限制之下。您的程序和服务器不在同一个域中,浏览器也不喜欢这样。

如果这是您的问题,那么如果没有更多信息,我很难提出解决方案。从您的帖子中看来,您可能对编码(或至少对与HTTP相关的编码)还不太陌生,而我可以为您的问题找到的最佳解决方案涉及一些相对复杂的方法,例如使用JavaScript代替UnityWebRequest

潜在解决方案2

当然,实际的问题甚至可能出在您周围的代码上,或者是您尝试访问的服务器上。您要调用的函数的代码是什么Post()?只有在浏览器中运行代码(JavaScript处理POST请求)时,事件顺序才会出现问题。

附带说明一下,如果您尝试访问的服务器具有其API的文档,则您的问题可能会在其中解决。


Max*_*axx 5

首先要指出的是UnityWebRequest实际上返回了响应

request.downloadHandler.text

虽然只返回一般错误信息

request.error


现在,如果你的情况是像我和你升级统一只让你的所有网络代码休息,你可能会看到有关错误的Content-Length

这是因为WWW和UnityWebRequest类现在都默认启用了chunkedTransfer.这似乎搞砸了如何发送内容长度并导致错误.

虽然目前可以为UnityWebRequest禁用chunkedTransfer,但在撰写本文时,无法为WWW类禁用它.对我来说,这意味着重写我所有的旧网络代码,而不是使用UnityWebRequest并进行设置

myUnityWebRequest.chunkedTransfer = false;

注意:UnityWebRequest当前不支持没有数据的POST.您仍然需要使用WWW类.