在无休止的研究和对不同组合进行测试之后,我现在毫无头绪。
我只有在我的byteArray
被System.Text.Encoding.UTF8.GetBytes("")
以外的其他内容填充时才会收到WebException: The request timed out
。(例如" Hello")
服务器设置是Google Load Balancer的HTTPS-Request,它通过HTTP与后端进行通信。后端是带有php的Apache。
用于测试目的(自签名的SSL-CERT),我有:
System.Net.ServicePointManager.ServerCertificateValidationCallback =
delegate (object s,
System.Security.Cryptography.X509Certificates.X509Certificate certificate,
System.Security.Cryptography.X509Certificates.X509Chain chain,
System.Net.Security.SslPolicyErrors sslPolicyErrors){
return true;
};
- 如果我在网络浏览器(Chrome)中输入URL,我会得到答复。
- 如果我使用Mozilla的HTTP-Requester(或者都没有内容发送),我将获得正确的响应数据(添加SSL-Security例外之后)
- 如果我在下面使用
System.Text.Encoding.UTF8.GetBytes("")
运行代码,一切都有效(除了我无法发送数据并接收我想要的内容)
这是我正在使用的代码。
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://someurl.com/some.php");
webRequest.Proxy = null;
webRequest.Credentials = CredentialCache.DefaultCredentials;
webRequest.Method = "POST";
webRequest.Timeout = 3000;
byte[] byteArray = System.Text.Encoding.UTF8.GetBytes("someData"); //works if empty
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.ContentLength = byteArray.Length;
Stream postData = webRequest.GetRequestStream();
postData.Write(byteArray, 0, byteArray.Length);
postData.Close();
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); //ERROR MESSAGE
Stream dataStream = webResponse.GetResponseStream();
reader = new StreamReader(dataStream);
string data = reader.ReadToEnd(); //output data
reader.Close ();
dataStream.Close ();
webResponse.Close ();
确切的错误(顺便说一句,所有这些发生在Unity3D编辑器中):
WebException: The request timed out
System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult)
System.Net.HttpWebRequest.GetResponse ()
那么,为什么在地球上不起作用,一旦有东西,getrequeststream必须写?
谢谢,一切顺利,Kruegbert
.. ::附录
- 如果我增加了超时,则需要更长的时间直到出现相同的味精为止。
- 如果我写
webRequest.ContentLength = byteArray.Length+1
,我会收到一个响应,但这是一个WebException错误:ProtocolError
- 如果我写
webRequest.ContentLength = byteArray.Length-1
,我得到ProtocolViolationException
- 我已经尝试使用相同行为的try/catch/使用相同的尝试
我想出了为什么它不起作用 - 我仍然不知道为什么它是这样的。(也许是Unityeditor)
我添加了
webRequest.ProtocolVersion = HttpVersion.Version10;
一切都起作用。没有更多的超时错误。是的webRequest.ProtocolVersion = HttpVersion.Version11;
导致超时错误。
但是,从网络中制作一个httprequest可以通过其中的任何一种来成功: HTTP/1.1
, HTTP/1.0 (with Host header)
, HTTP/1.0 (without Host header)