WebURL an Private Shared Async Function übergeben

  • VB.NET
  • .NET 5–6

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Fakiz.

    WebURL an Private Shared Async Function übergeben

    Hallo Zusammen,

    folgendes Problem...

    Ich habe einen Code um Apis aus zu lesen und wollte es folgender maßen machen:

    VB.NET-Quellcode

    1. Imports System.Net.Http
    2. Imports Windows.Media.Protection.PlayReady
    3. Private Function readAPI()
    4. Dim response As String = readwebadress(UrlzurAPi)
    5. 'Danach die Auswertung
    6. End Function
    7. Public Class webread
    8. 'https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=net-6.0
    9. ' HttpClient is intended to be instantiated once per application, rather than per-use. See Remarks.
    10. Shared ReadOnly client As HttpClient = New HttpClient()
    11. Private Shared Async Function readwebadress(ByVal weburl) As Task
    12. ' Call asynchronous network methods in a try/catch block to handle exceptions.
    13. Try
    14. Using response As HttpResponseMessage = Await client.GetAsync(weburl)
    15. response.EnsureSuccessStatusCode()
    16. weburl = Await response.Content.ReadAsStringAsync()
    17. End Using
    18. Catch e As HttpRequestException
    19. Console.WriteLine(Environment.NewLine & "Exception Caught!")
    20. Console.WriteLine("Message :{0} ", e.Message)
    21. End Try
    22. End Function
    23. End Class


    leider wird mir direkt vor dem erstellen gleich folgender Fehler anzeigt

    Quellcode

    1. Dim response As String = readwebadress(UrlzurAPi)
    2. Fehler BC30451 "readwebadress" wurde nicht deklariert. Aufgrund der Schutzstufe ist unter Umständen kein Zugriff möglich.


    Was genau mache ich falsch und wie kann ich es lösen?
    Wenn ich dich richtig vertanden habe so:

    VB.NET-Quellcode

    1. Imports System.Net.Http
    2. Imports Windows.Media.Protection.PlayReady
    3. Private Function readAPI()
    4. Dim response As String = webread.readwebadress(UrlzurAPi)
    5. 'Danach die Auswertung
    6. End Function
    7. Public Class webread
    8. 'https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=net-6.0
    9. ' HttpClient is intended to be instantiated once per application, rather than per-use. See Remarks.
    10. Shared ReadOnly client As HttpClient = New HttpClient()
    11. Public Shared Async Function readwebadress(ByVal weburl) As Task
    12. ' Call asynchronous network methods in a try/catch block to handle exceptions.
    13. Try
    14. Using response As HttpResponseMessage = Await client.GetAsync(weburl)
    15. response.EnsureSuccessStatusCode()
    16. weburl = Await response.Content.ReadAsStringAsync()
    17. End Using
    18. Catch e As HttpRequestException
    19. Console.WriteLine(Environment.NewLine & "Exception Caught!")
    20. Console.WriteLine("Message :{0} ", e.Message)
    21. End Try
    22. End Function
    23. End Class


    Jetzt bekomme ich die Meldung, dass Task nicht in String konfertiert werden kann
    Ah, habe es selbe rausgefunden:

    VB.NET-Quellcode

    1. Imports System.Net.Http
    2. Imports Windows.Media.Protection.PlayReady
    3. Private Function readAPI()
    4. Dim responseweb As Task(Of String) = webread.readwebadress(URLtoAPI)
    5. Dim response As String = responseweb.Result
    6. 'Danach die Auswertung
    7. End Function
    8. Public Class webread
    9. 'https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=net-6.0
    10. ' HttpClient is intended to be instantiated once per application, rather than per-use. See Remarks.
    11. Shared ReadOnly client As HttpClient = New HttpClient()
    12. Public Shared Async Function readwebadress(ByVal weburl) As Task(Of String)
    13. ' Call asynchronous network methods in a try/catch block to handle exceptions.
    14. Try
    15. Using response As HttpResponseMessage = Await client.GetAsync(weburl)
    16. response.EnsureSuccessStatusCode()
    17. weburl = Await response.Content.ReadAsStringAsync()
    18. End Using
    19. Catch e As HttpRequestException
    20. Console.WriteLine(Environment.NewLine & "Exception Caught!")
    21. Console.WriteLine("Message :{0} ", e.Message)
    22. End Try
    23. End Function
    24. End Class

    Fakiz schrieb:

    Eine Funktion gibt in der Regel etwas zurück. Da heißt für dich anstelle den ResponseString in eine Variable zu packen musst du ihn zurück geben.


    Also eine Globale Variable dürber legen als "Datenaustausch"?


    VB.NET-Quellcode

    1. Imports System.Net.Http
    2. Imports Windows.Media.Protection.PlayReady
    3. Public url
    4. Public request
    5. Private Function readAPI()
    6. url = URLtoAPI
    7. readwebadress()
    8. 'Danach die Auswertung request
    9. End Function
    10. Public Class webread
    11. 'https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=net-6.0
    12. ' HttpClient is intended to be instantiated once per application, rather than per-use. See Remarks.
    13. Shared ReadOnly client As HttpClient = New HttpClient()
    14. Public Shared Async Function readwebadress() As Task
    15. ' Call asynchronous network methods in a try/catch block to handle exceptions.
    16. Try
    17. Using response As HttpResponseMessage = Await client.GetAsync(url)
    18. response.EnsureSuccessStatusCode()
    19. request = Await response.Content.ReadAsStringAsync()
    20. End Using
    21. Catch e As HttpRequestException
    22. Console.WriteLine(Environment.NewLine & "Exception Caught!")
    23. Console.WriteLine("Message :{0} ", e.Message)
    24. End Try
    25. End Function
    26. End Class
    Das ist schoma überhaupt kein sinnvoller Satz:

    Sisco schrieb:

    Also eine Globale Variable dürber legen als "Datenaustausch"?
    Variablen kann man nicht "drüberlegen" (über was auch immer?).

    Tu, was Fakiz sagt:

    Fakiz schrieb:

    anstelle den ResponseString in eine Variable zu packen musst du ihn zurück geben.
    also

    VB.NET-Quellcode

    1. 'statt
    2. request = Await response.Content.ReadAsStringAsync()
    3. 'mach
    4. Return Await response.Content.ReadAsStringAsync() ' Grundlage: Das Schlüsselwort 'Return' heisst: "zurückgeben"
    jo, scheinbar kennst du das Return-Feature der ComputerSprache(n) noch nicht.
    Beschäftige dich mit diesen Grundlagen. Die sind eminent wichtig, ohne die kann man nicht nur nicht programmieren, sondern man kann sich mit Programmierern nichtmal unterhalten.
    Grundlagen: Fachbegriffe

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Leider nein... Ich weiß es auch nicht. Ich will einfach nur meinen Code auf Stand bringen und von alten Dingen weg.
    normalerweise mache ich so und es funktioniert:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim URLToAPI as String = 'Adresse zur API
    4. ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
    5. Dim webClient As New System.Net.WebClient
    6. Dim result As String = webClient.DownloadString(URLtoAPI)
    7. End Sub
    8. End Class


    Da Visual Studio immer meckert, dass ich nicht mehr webClient sondern HttpClient verwenden sollte, bin ich auf den Code von Microsoft gestoßen. Dabei dachte ich mir: Dann mach es gleich ordentlich und pack alles in eine Klasse, damit du den Code nur einmla hast und alles daraus abfragst.

    Der folgende Code läuft nicht, das Programm startet und macht nicht. Keine Fehlermeldung, kein Ergebnis, Nicht mal die Form1 wird dargestellt. Auch wenn ich es ne Stunde laufen lasse:


    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim URLToAPI as String = 'Adresse zur API
    4. Dim responseweb As Task(Of String) = webread.readwebadress(URLToAPI)
    5. Dim response As String = responseweb.Result
    6. MessageBox.Show(response)
    7. End Sub
    8. End Class


    Webread Klasse in einer separaten werbread.vb

    VB.NET-Quellcode

    1. Imports System.Net.Http
    2. Public Class webread
    3. 'https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=net-6.0
    4. ' HttpClient is intended to be instantiated once per application, rather than per-use. See Remarks.
    5. Shared ReadOnly client As HttpClient = New HttpClient()
    6. Public Shared Async Function readwebadress(ByVal weburl) As Task(Of String)
    7. ' Call asynchronous network methods in a try/catch block to handle exceptions.
    8. Try
    9. Using response As HttpResponseMessage = Await client.GetAsync(weburl)
    10. response.EnsureSuccessStatusCode()
    11. Return Await response.Content.ReadAsStringAsync()
    12. End Using
    13. Catch e As HttpRequestException
    14. MessageBox.Show("Message :{0} ", e.Message)
    15. End Try
    16. End Function
    17. End Class


    Vermutlich werde ich langsam doch zu alt. Früher viel mir das alles mal leichter.
    Ich hab dir mal ein Beispiel erstellt. Allerdings sind meine Vb Kenntnisse eher bescheiden und hab das ganze von C# nach Vb übersetzen lassen. Ob das lauffähig ist kann ich nicht sagen. Die Klasse webread heisst bei mir APIRequest und ist nicht statisch.

    Form

    VB.NET-Quellcode

    1. Public Partial Class Form1
    2. Inherits Form
    3. Private ReadOnly apiRequest As APIRequest
    4. Public Sub New()
    5. InitializeComponent()
    6. apiRequest = New APIRequest()
    7. End Sub
    8. Private Async Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
    9. Dim responseString As String = Await apiRequest.GetData(New Uri("https://www.whatismyip.com/"))
    10. richTextBox1.Text = responseString
    11. End Sub
    12. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs)
    13. apiRequest?.Dispose()
    14. End Sub
    15. End Class


    APIRequest

    VB.NET-Quellcode

    1. Public NotInheritable Class APIRequest
    2. Inherits IDisposable
    3. Public Property Client As HttpClient
    4. Public Sub New()
    5. Client = New HttpClient()
    6. Client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0")
    7. End Sub
    8. Public Sub Dispose()
    9. Client?.Dispose()
    10. End Sub
    11. Public Async Function GetData(ByVal uri As Uri) As Task(Of String)
    12. Try
    13. Client.BaseAddress = uri
    14. Using response As HttpResponseMessage = Await Client.GetAsync(uri)
    15. response.EnsureSuccessStatusCode()
    16. Return Await response.Content.ReadAsStringAsync()
    17. End Using
    18. Catch ex As HttpRequestException
    19. Return ex.Message
    20. End Try
    21. End Function
    22. End Class