0

私は現在、特定の URI から http 応答を取得する必要がある VB.net プロジェクトに取り組んでいますが、要求は http プロキシを経由する必要があります。問題が発生したのは、プロキシ サーバーが機能せず、アプリケーションがエラーをスローすることがあることに気付いたときです。プロキシが機能しているかどうかをアプリで確認したいのですが、そうでない場合は、プロキシ リスト/配列から別のプロキシを取得します。また、代替案があればお気軽に共有してください。

現在、私はこれを使用しています(これは静的であり、エラーがスローされた場合、プロキシを手動で変更する必要があります):

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

参考までに: 私のプロキシは認証を必要としません。

正しく説明できなかったら申し訳ありません。正直に言うと、私は VB.net の初心者です。

お時間をいただき、ありがとうございました。あなたの助けに感謝。

4

1 に答える 1

0

この質問からの借用

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
于 2016-10-04T17:53:57.667 に答える