После бесконечных исследований и испытаний различных комбинаций, я сейчас ничего не понимаю.
Я получаю WebException: The request timed out
только если я мой byteArray
наполняется чем-то еще, чем System.Text.Encoding.UTF8.GetBytes("")
, (Как «привет»)
Настройка сервера — это https-запрос к Google Load Balancer, который связывается с бэкэндом через HTTP. Бэкэнд — это Apache с PHP.
Для целей тестирования (самозаверяющий SSL-сертификат) у меня есть это:
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;
};
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
Я выяснил, почему это не работает — все еще я не знаю, почему это ведет себя так. (Может быть, вещь 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)
Других решений пока нет …