2016-10-04 8 views
0

В настоящее время я работаю над проектом VB.net, где мне нужно получить ответы HTTP от определенного URI, но запросы должны пройти через http proxy, с которым я отлично справляюсь. Проблема возникла, когда я понял, что иногда наши прокси-серверы не работают, а затем приложение выдает ошибку. Я хочу, чтобы мое приложение проверяло, работает ли прокси-сервер или нет, если нет, то я хочу, чтобы он использовал другой прокси-сервер из списка/массива прокси. А также, пожалуйста, не стесняйтесь делиться, если у вас есть альтернативные идеи.vb.net несколько webproxy в httpwebrequest

В настоящее время я использую это (который является статическим и, когда он выдает ошибку, мне нужно вручную изменять прокси-сервер):

Dim proxyObject As WebProxy = New WebProxy("192.168.0.10:80") 
request.Proxy = proxyObject 

То, что я хочу что-то вроде этого:

If WebProxy("192.168.0.10:80") is working fine Then 
    Execute the response 
Else 
    Take the next proxy address from the list/array and go back to the starting 
    of "If" 
End If 

FYI: мои прокси не требуют аутентификации.

Прошу прощения, если я не могу объяснить это правильно, и, честно говоря, я довольно новичок в VB.net.

Большое спасибо за ваше время и терпение. Ценю вашу помощь.

ответ

0

Заимствуя this question

Dim urlList As New List(Of String) 'Urls stored here 

For each urlString as string in urlList 
    If CheckProxy(urlString) Then 
     'Execute the response 
    else 
     Continue For 'or something else here, mark it as bad? 
    End If 
next 

    Public Shared Function CheckProxy(ByVal Proxy As String) As Boolean 
     Dim prx As Uri = Nothing 
     If Uri.TryCreate(Proxy, UriKind.Absolute, prx) Then 
      Return CheckProxy(prx) 
     ElseIf Uri.TryCreate("http://" & Proxy, UriKind.Absolute, prx) Then 
      Return CheckProxy(prx) 
     Else 
      Return False 
     End If 
    End Function 

    Public Shared Function CheckProxy(ByVal Proxy As Uri) As Boolean 
     Dim iProxy As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) 
     iProxy.ReceiveTimeout = 500 : iProxy.SendTimeout = 500 
     Try 
      '' Connect using a timeout (1/2 second) 
      Dim result As IAsyncResult = iProxy.BeginConnect(Proxy.Host, Proxy.Port, Nothing, Nothing) 
      Dim success As Boolean = result.AsyncWaitHandle.WaitOne(500, True) 
      If (Not success) Then 
       iProxy.Close() : Return False 
      End If 
     Catch ex As Exception 
      Return False 
     End Try 

     Dim bytData() As Byte, strData As String 
     Dim iDataLen As Integer = 1024 
     strData = String.Format("CONNECT {0}:{1} HTTP/1.0{2}{2}", "www.google.com", 80, vbNewLine) 

     bytData = System.Text.ASCIIEncoding.ASCII.GetBytes(strData) 
     If iProxy.Connected Then 
      iProxy.Send(bytData, bytData.Length, SocketFlags.None) 
      ReDim bytData(1024) 
      Do 
       Try 
        iDataLen = iProxy.Receive(bytData, bytData.Length, SocketFlags.None) 
       Catch ex As Exception 
        iProxy.Close() : Return False 
       End Try 
       If iDataLen > 0 Then 
        strData = System.Text.ASCIIEncoding.ASCII.GetString(bytData) 
        Exit Do 
       End If 
      Loop 
     Else 
      Return False 
     End If 
     iProxy.Close() 

     Dim strAttribs() As String 
     strAttribs = strData.Split(" "c) 
     If strAttribs(1).Equals("200") Then 
      Return True 
     Else 
      Return False 
     End If 
    End Function 
+0

Большое спасибо за Ваш ответ. Я дам ему попробовать сегодня вечером и опубликую обновление. –

+0

Я не тестировал его полностью, но я искал пару примеров, и их метод был похож. Дайте мне знать, как это происходит! –