c # — HttpWebRequest получает & quot; WebException: истекло время ожидания запроса & quot;

После бесконечных исследований и испытаний различных комбинаций, я сейчас ничего не понимаю.

Я получаю 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;
};
  • Если я ввожу URL в свой веб-браузер (Chrome), я получаю ответ.
  • Если я использую HTTP-запросчик из Mozilla с контентом или без контента для отправки, я получаю правильные данные ответа (после добавления исключения 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 / using, что привело к тому же поведению

0

Решение

Я выяснил, почему это не работает — все еще я не знаю, почему это ведет себя так. (Может быть, вещь 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)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]