2015-10-20 29 views
14

我已经问上answers.unity3d但没有回应,我会问上也是如此..WWW.responseHeader [“STATUS”]不存在

我不能检索的HTTP状态对Windows Phone 8和Windows RT 8.1上的WWW对象的响应(虽然在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

+0

只是为了验证 - 这是一个HTTP(S)请求,而不是'file://'或其他协议?头文件会提示HTTP,但这些东西往往会在某些环境中被模拟,而且在android上使用'file://'协议之前我确实有过这种行为。 –

+0

这是一个简单的'http'请求下载文件,所以我需要304/200信息:) – Hacketo

+0

您的www对象.error是否回来没有任何错误? –

回答

1

你的网络服务器可能与不同的(意外)针对每个设备响应HTTP状态。由于各种原因,如用户代理字符串,这可能导致WWW类不能获取状态。

首先,我会安装一个代理,以便您可以准确了解手机发送的内容以及服务器原始响应的内容。 Charles Proxy(mac/windows)或Fiddler(windows)都很棒。

这里是一个团结WWW类使用生成状态的实际代码:

 if (num++ == 0 && text.StartsWith("HTTP")) 
     { 
      dictionary["STATUS"] = text; 
     } 

编号:https://github.com/MattRix/UnityDecompiled/blob/master/UnityEngine/UnityEngine/WWW.cs#L483

从代理应该很清楚发生了什么。如果不是,请在这里发布请求和响应(原始)。

+0

该代码实际上使用'responseHeaderString'作为'text',并且'responseHeaderString'不包含HTTP状态。所以头部结构可能不会满足这个条件,我会重新检查什么时候可以使用wireshark,但我确信每个设备的响应都是相同的,并且符合HTTP。 – Hacketo

+0

统一使用响应,所以'responseHeaderString'可能不是服务器正在发送的真实指示。 – peterept

+0

与wireshark捕获,它作为代理运行,并且你的Windows手机被设置为通过它进行通信?你可以分享服务器的URL吗? – peterept

0

尝试在查找STATUS标头之前阅读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"]; 
     } 
    } 
}