2016-09-23 7 views
0

У меня есть странная проблема, когда мое приложение пытается выполнить HTTP HTTP-запрос для вызова API. Как правило, это проходит без проблем, однако, если пользователь берет свой ноутбук домой и подключается через свою домашнюю сеть, затем спящий режим с машиной и возвращается на работу на следующий день, HTTPWebRequest терпит неудачу либо с ошибкой тайм-аута, либо просто с тем, что URL-адрес не может быть достигнуто. Как только они перезагружают ноутбук, соединение, как правило, снова отлично.httpWebRequest тайм-аут/неудачное соединение после спящего режима и сетей коммутации ноутбуков

Я провел много дней, пытаясь выяснить, что может быть причиной этого, таких как проблемы с прокси-соединением или проблемы с сетевой картой в ноутбуке, но пока не удалось установить диагностику или исправление.

У кого-нибудь есть предложения по поводу того, что может быть проблемой, или как я могу лучше диагностировать это?

Код:

Private Function WRequestMainDynamic(URL As String, method As String, POSTdata As String, timeout As Integer, Optional ByRef proxyType As Integer = 0) 
    Dim responseData As String = "" 
    Dim hwrequest As Net.HttpWebRequest = Nothing 
    Dim postByteArray() As Byte = Nothing 
    Dim connectionSuccess As Boolean = False 
    Dim count As Integer = 0 

    While connectionSuccess = False And count < 6 
     Try 
      hwrequest = Net.WebRequest.Create(URL) 
      hwrequest.Accept = "*/*" 
      hwrequest.AllowAutoRedirect = True 
      hwrequest.UserAgent = "http_requester/0.1" 
      hwrequest.Timeout = timeout 
      hwrequest.Method = method 
      hwrequest.KeepAlive = True 

      Select Case proxyType 
       Case 0 
        hwrequest.Proxy = Nothing 
       Case 1 
       'don't set anything 
       Case 2 
        hwrequest.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials 
       Case Else 
        hwrequest.Proxy = Nothing 
      End Select 

      ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls Or SecurityProtocolType.Ssl3 
      ServicePointManager.Expect100Continue = False 

      If hwrequest.Method = "POST" Then 
       hwrequest.ContentType = "application/json" 
       Dim encoding As New Text.UTF8Encoding() 'Use UTF8Encoding for XML requests 
       postByteArray = encoding.GetBytes(POSTdata) 
       hwrequest.ContentLength = postByteArray.Length 
       Using postStream As IO.Stream = hwrequest.GetRequestStream() 
        postStream.Write(postByteArray, 0, postByteArray.Length) 
       End Using 
      End If 

      Using hwresponse As Net.HttpWebResponse = hwrequest.GetResponse() 
       If hwresponse.StatusCode = Net.HttpStatusCode.OK Then 
        Using responseStream As IO.StreamReader = New IO.StreamReader(hwresponse.GetResponseStream()) 
         responseData = responseStream.ReadToEnd() 
        End Using 
       End If 
      End Using 

      connectionSuccess = True 

     Catch webex As WebException 
      If webex.Status = WebExceptionStatus.Timeout Then 
       Throw 
      Else 
       proxyType += 1 
       If proxyType = 3 Then proxyType = 0 
       count += 1 
       If count = 6 Then Throw 
      End If 
     Catch e As Exception 
      Throw 
      responseData = "" 
     Finally 
      postByteArray = Nothing 
      hwrequest = Nothing 
      GC.Collect() 
     End Try 
    End While 
+0

Используйте функции ведения журнала system.net (http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.html), чтобы узнать, к какому серверу он пытается подключиться после спящего режима. – feroze

+0

Спасибо, как я могу добавить/интегрировать этот файл конфигурации с моим приложением (проект надстройки Outlook), у меня есть файл app.config, это где я должен добавить его? – moatak787

+0

Да, добавьте его в файл app.config для вашего контроля. – feroze

ответ

0

Кажется, разные прокси требуют различной конфигурации с помощью свойства Proxy объекта Net.HttpWebRequest, и даже различные типы подключения WiFi/LAN действовать по-другому тоже.

В большинстве случаев ничего не работает с ним, но мы обнаружили, что иногда вам нужно специально установить Proxy.Credentials по умолчанию, так как он не может получить их автоматически, а в других случаях проще установить Proxy = Ничего не следует обходить.

Для учета всех сценариев мы вставляем все три в код в соответствии с вышеизложенным и передаем переменную ByRef proxyType, в которой хранится последняя (как целое), которая соединяется нормально. В каждом HttpRequest, если он терпит неудачу, перебирайте другие методы в случае, если один из них работает, если это так, то передайте это обратно в переменной, которая будет использоваться при следующем вызове. Если все ошибки после X числа попыток, то вызывают исключение.

Код в моем исходном вопросе делает это, просто убедитесь, что вы правильно проходите обратно в переменной proxyType каждый раз!

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

  • Нет связанных вопросов^_^