2016-06-24 2 views
0

После бесконечных исследований и тестирования различных комбинаций, я сейчас не знаю.HttpWebRequest получает «WebException: время ожидания запроса»

Я получаю WebException: The request timed out, только если я мой byteArray заполняется чем-то еще чем System.Text.Encoding.UTF8.GetBytes(""). (Например, «привет»)

Настройка сервера - это https-запрос к балансировщику загрузки Google, который связывается с бэкэнд через HTTP. Бэкэнд - это Apache с PHP.

Для целей тестирования (самозаверяющими 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; 
    }; 
  • Если я ввожу URL в моем веб-браузере (Chrome), я получаю ответ.
  • Если я использую HTTP-запрашивающий от Mozilla с или без содержания для отправки, я получаю правильные данные ответа (после добавления исключения SSL-Security)
  • Если я запускаю мой код ниже с System.Text.Encoding.UTF8.GetBytes("") все работает (кроме I не может отправлять данные и, следовательно, получать то, что я хочу)

Вот код, который я использую.

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/улова/используя полученный таким же поведением
+0

Просто, чтобы быть уверенным, надеюсь, вы пробовали 'webRequest.ContentLength = byteArray.Length'. –

+0

Да, да. Впоследствии я просто экспериментировал с этим. – Kruegbert

ответ

1

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

+0

Просто обновить мой ответ, работая с 'webRequest.ProtocolVersion = HttpVersion.Version11;' Мне нужно добавить 'webRequest.ServicePoint.Expect100Continue = false;' поскольку сервер не поддерживает HTTP/1.1 100 Продолжить ответ. – Kruegbert

+0

Это исправление также работает для меня. Тем не менее, мне бы очень хотелось узнать * почему? Дополнительная информация: Я тоже работаю в Unity, но это происходит со мной на iPhone, а не в редакторе, и только после того, как приложение работает некоторое время. Бэкэндом является Amazon CloudFront. – oferei

Смежные вопросы