HttpWebRequest收到" WebException:请求超时"

时间:2016-06-24 19:55:58

标签: c# php ssl unity3d httpwebrequest

经过对不同组合的无休止的研究和测试,我现在一无所知。

只有当我的WebException: The request timed outbyteArray以外的其他内容填满时,我才会收到System.Text.Encoding.UTF8.GetBytes("")。 (比如"你好")

服务器设置是对Google Load Balancer的https请求,后者通过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)中输入网址,我会收到回复。
  • 如果我使用Mozilla的HTTP请求者发送或不发送内容,我会得到正确的响应数据(在添加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

.. ::附录

  • 如果我增加超时,只需要更长的时间,直到出现相同的msg。
  • 如果我写webRequest.ContentLength = byteArray.Length+1我收到回复,但它是WebException错误:ProtocolError
  • 如果我写webRequest.ContentLength = byteArray.Length-1,我会收到ProtocolViolationException
  • 我已尝试使用try / catch / using导致相同的行为

1 个答案:

答案 0 :(得分:1)

我想通了,为什么它不起作用 - 我仍然不知道为什么它会像这样。 (也许是UnityEditor的事情)

我添加了

webRequest.ProtocolVersion = HttpVersion.Version10;

一切正常。没有更多的超时错误。是的webRequest.ProtocolVersion = HttpVersion.Version11;会导致超时错误。

但是,通过网络发布HttpRequest会成功:HTTP/1.1HTTP/1.0 (with Host header)HTTP/1.0 (without Host header)