WWW.responseHeader["STATUS"]不存在。

14
我已经在answers.unity3d上提问,但由于没有回应,我也会在SO上问一下。
我无法在Windows Phone 8和Windows RT 8.1上检索WWW对象的响应http状态(而在IOS / Android上可以)。 www.responseHeader ["STATUS"]不存在,隐藏字段_responseHeaderString不包含第一行

HTTP / 1.1 200 OK


responseHeaderString :

Server: nginx
Date: Wed, 21 Oct 2015 07:44:36 GMT
Last-Modified: Mon, 07 Sep 2015 11:43:46 GMT
Connection: keep-alive
Expires: Fri, 20 Nov 2015 07:44:36 GMT
Cache-Control: max-age=2592000
Cache-Control: public

responseHeader :

{
    "SERVER"       : "nginx"
    "DATE"         : "Wed, 21 Oct 2015 07:44:36 GMT"
    "LAST-MODIFIED": "Mon, 07 Sep 2015 11:43:46 GMT"
    "CONNECTION"   : "keep-alive"
    "EXPIRES"      : "Fri, 20 Nov 2015 07:44:36 GMT"
    "CACHE-CONTROL": "public"
}

重现示例代码:(在空的新项目上测试)

WWW www = new WWW("http://www.google.com");

yield return www;

Debug.Log("Google Status : " + www.responseHeaders.ContainsKey("STATUS")); // False
Debug.Log(www.text); // <doctype ...
Debug.Log(www.responseHeaders["STATUS"]); // KeyError

我是否遗漏了什么,还是有人能够确认这是一个错误吗?

编辑: 最新的5.3仍无法检索到http状态。


只是为了确认 - 这是一个HTTP(S)请求,而不是file://或其他协议吗?头部应该表明是HTTP,但在某些环境中往往会模拟这些东西,在安卓上使用file://协议时我曾经遇到过这种情况。 - Krzysztof Bociurko
这是一个简单的http请求,用于下载文件,因此我需要304/200信息 :) - Hacketo
你的www对象.error返回时是否没有任何错误? - MX D
@MXD 不是的,www.errornull - Hacketo
Unity 5.2.2昨天发布了,如果你想试一试的话。 - user3071284
已将项目更新至5.2.2版本,但“STATUS”仍然缺失 :/ - Hacketo
2个回答

1
您的网络服务器可能会对每个设备响应不同(意外)的响应。出于各种原因,例如用户代理字符串,这可能导致WWW类无法获取状态。
首先,我建议安装代理,以便您可以准确地查看手机发送的内容和服务器的原始响应。Charles Proxy(mac/windows)或Fiddler(windows)都是很好的选择。
以下是Unity WWW类用于生成状态的实际代码:
        if (num++ == 0 && text.StartsWith("HTTP"))
        {
            dictionary["STATUS"] = text;
        }

参考:https://github.com/MattRix/UnityDecompiled/blob/master/UnityEngine/UnityEngine/WWW.cs#L483

从代理中应该清楚地了解正在发生的事情。如果不清楚,请在此处发布请求和响应(原始数据)。


这段代码实际上将responseHeaderString作为text使用,而responseHeaderString并不包含HTTP状态。因此,头部构建可能无法满足此条件,我会尽快用Wireshark重新检查,但我确定响应对于每个设备都是相同的,并且符合HTTP标准。 - Hacketo
通过Wireshark捕获的数据包,它是否作为代理运行,并且您的Windows手机是否设置为通过它进行通信?您能分享服务器的URL吗? - peterept
好的,太棒了。还可以尝试使用https://redbot.org获取您的URL(它可能会显示一些不正确的内容)。 - peterept
哇,这是一个疯狂的复现。www.error 里有什么吗?我没有 Windows 手机来验证。 - peterept
我没有看到任何类似的错误报告。如果其他Windows手机也有这个问题,那就很有趣了。当我不使用www时,我使用uniweb:https://www.assetstore.unity3d.com/en/#!/content/483 - peterept
显示剩余4条评论

0

在查找状态头之前,请尝试阅读www.error。

// Construct the response object
string error = www.error;
if (error == null) {
    if (www.responseHeaders.ContainsKey("STATUS")) {
        string [] status=www.responseHeaders["STATUS"].Split(' ');
        if (status.Length>2 && status[2] != "OK") {
            error = www.responseHeaders["STATUS"];
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接