VB problem z Client.OpenRead

0

Witam wszystkich,

Borykam się z problemem, którego nie jestem w stanie rozwiązać, a przynajmniej nie wiem gdzie szukać przyczyny. Próbuje wykorzystać funkcję "Client.OpenRead" do weryfikacji dostępności serwisu oraz docelowo pliku, który będzie pobierany ze ścieżki. W tym celu stworzyłem małą aplikację testową, której wynik mnie zadziwia. Odpytuję 3 serwisy i dwa odpowiadają prawidłowo, a w przypadku nazwa.pl, gdzie jednocześnie mam wykupioną domenę nie mam odpowiedzi. Gdzie szukać? Jakieś pomysły? Załączam dwa screeny, z kodem i wynikiem działania aplikacji.

Private Sub TextBox1_TextChanged_2(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
Try
Using Client = New System.Net.WebClient
Using Stream = Client.OpenRead("https://google.pl")
TextBox1.Text = "Online"
End Using
End Using

    Catch ex As Exception
        TextBox1.Text = "Offline"
    End Try


End Sub

Private Sub TextBox2_TextChanged_1(sender As Object, e As EventArgs) Handles TextBox2.TextChanged
    Try
        Using Client = New System.Net.WebClient
            Using Stream = Client.OpenRead("https://raciborz.pl")
                TextBox2.Text = "Online"
            End Using
        End Using

    Catch ex As Exception
        TextBox2.Text = "Offline"
    End Try
End Sub

Private Sub TextBox3_TextChanged(sender As Object, e As EventArgs) Handles TextBox3.TextChanged
    Try
        Using Client = New System.Net.WebClient
            Using Stream = Client.OpenRead("https://nazwa.pl")
                TextBox3.Text = "Online"
            End Using
        End Using

    Catch ex As Exception
        TextBox3.Text = "Offline"
    End Try
End Sub
0

Sprawdziłem w C# przy użyciu WebClient.
Sypał błędem: "Żądanie zostało przerwane: Nie można utworzyć bezpiecznego kanału SSL/TLS".
Również tylko dla nazwa.pl. Jak się okazało powodem jest zastosowany przez nich protokół Tls12.
W przypadku C# włączenie protokołu Tls12 rozwiązuje problem:

ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;

W VB wygląda to chyba tak samo.

0
Dyzma napisał(a):

Sprawdziłem w C# przy użyciu WebClient.
Sypał błędem: "Żądanie zostało przerwane: Nie można utworzyć bezpiecznego kanału SSL/TLS".
Również tylko dla nazwa.pl. Jak się okazało powodem jest zastosowany przez nich protokół Tls12.
W przypadku C# włączenie protokołu Tls12 rozwiązuje problem:

ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;

W VB wygląda to chyba tak samo.

Niestety nie pomogło.

W VB nie ma Tls12 tylko Tls lub SSL3.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3

W obu przypadkach wstawienie tej linii nie rozwiązuje problemu ;/

0

Na szybko napisałem testową aplikację w VB (mój pierwszy program w VB :D).

Imports System.Net

Module Module1

    Sub Main()
        Try
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

            Using Client = New System.Net.WebClient
                Using Stream = Client.OpenRead("https://nazwa.pl")

                End Using
            End Using

        Catch ex As Exception
            Console.Write(ex.Message)
        End Try
    End Sub

End Module

Postawiłem break'e point'a w catch'u.
Przed dodaniem Tls12 wchodził tam i rzucał ten sam wyjątek o którym wspominałem.
Po dodaniu już tam nie wszedł, więc zgaduje, że działa (nie sprawdzałem co jest w response).

Możesz nie mieć Tls12 jeśli masz starszą wersję .NET'a (sprawdź w necie w której to dodali).

0

Udało się rozwiązać problem. Podniosłem .Net do 4.7.2 i weszło na Tls1.2

Teraz mam już ostatni problem jak zatem uruchomić wywołanie:

Const Path = "https://serwer.pl/plik.exe"

Dodam, że jak odpalam na zwykłym http:// to działa idealnie. Kiedy wchodzę na https:// jest problem.

Gdzie zatem wstawić ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12, żeby zadziałało?

0

Tę linię musisz wstawić przed wywołaniem kodu, który z niej korzysta.
Równie dobrze może to być początek programu.
Swoją drogą czasem warto użyć |= zamiast = w tym przypadku. Nie wiem czy w VB to działa jak w C#.
Ale poczytaj sobie o tym. ;)

0

Public Sub Print()
Try

        Using Client = New System.Net.WebClient
           System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

            Const Path = "https://serwer.pl/plik.doc" **<------ dla http://serwer.pl/plik.doc drukuje, przy opcji<u> https</u>: nie ;/**

*reszta kodu

  End Using
    Catch ex As Exception

    End Try
0

Nie wiem jak wygląda reszta kodu. Ale to teraz nieistotne.
Po prostu wrzuć tę linię na samą górę. Niech wykonuje się pierwsza. I sprawdź czy działa.
A jeśli nie będzie działać, to nie wrzucaj jak w pierwszym poście efektów obsługi błędów swojego programu, tylko
przechwyć wyjątek i wrzuć jego treść.

1 użytkowników online, w tym zalogowanych: 0, gości: 1