WebRequest aus Klasse funktioniert nicht, aus Windows-Form aber schon

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von 100Volt.

    WebRequest aus Klasse funktioniert nicht, aus Windows-Form aber schon

    Hallo,

    ich möchte folgenden Code ausführen:

    VB.NET-Quellcode

    1. Friend Sub Test()
    2. System.Net.ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf AcceptCert)
    3. Dim req As System.Net.WebRequest = CType(System.Net.WebRequest.Create("https://machine1/api/geraetedaten"), System.Net.WebRequest)
    4. req.Credentials = New System.Net.NetworkCredential("webserver", "12345678")
    5. req.Method = "POST"
    6. req.ContentType = "application/x-www-form-urlencoded"
    7. Dim enc As System.Text.UTF8Encoding
    8. enc = New System.Text.UTF8Encoding()
    9. Dim postdata As String
    10. Dim postdatabytes As Byte()
    11. postdata = "complete=true"
    12. postdatabytes = enc.GetBytes(postdata)
    13. req.ContentLength = postdatabytes.Length
    14. Dim dataStream As System.IO.Stream = req.GetRequestStream()
    15. dataStream.Write(postdatabytes, 0, postdatabytes.Length)
    16. Dim response As System.Net.WebResponse
    17. response = req.GetResponse()
    18. Dim strStatus As String = CType(response, System.Net.HttpWebResponse).StatusDescription
    19. Dim strResponse As String = response.Headers.ToString
    20. ' Clean up the streams and the response.
    21. response.Close()
    22. dataStream.Close()
    23. End Sub
    24. Private Function AcceptCert(ByVal sender As Object, ByVal cert As System.Security.Cryptography.X509Certificates.X509Certificate,
    25. ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain,
    26. ByVal errors As System.Net.Security.SslPolicyErrors) As Boolean
    27. Return True
    28. End Function


    Wenn sich die Prozedur Test und die Funktion AcceptCert in der Klasse einer Windows-Form befinden, geht es problemlos. Stehe hingegen beides in einer "normalen" Klasse, hängt es ca. 100 Sekunden hier:

    VB.NET-Quellcode

    1. Dim dataStream As System.IO.Stream = req.GetRequestStream()

    und bringt dann den Fehler: System.Net.WebException: "Timeout für Vorgang überschritten"

    Es handelt sich um dasselbe VB-Projekt.

    Woran kann das liegen?


    Carsten
    --------
    Lieber inkompetent als inkontinent
    Ich habe es mit noch einer weiteren Klasse probiert. Dann irgendwann gab es an dieser Stelle:

    VB.NET-Quellcode

    1. response = req.GetResponse()

    den Fehler:
    System.Net.ProtocolViolationException: "Sie müssen ContentLength-Byte für den Anforderungsstream schreiben, bevor Sie [Begin]GetResponse aufrufen."

    Ich habe dann die Zeile:

    VB.NET-Quellcode

    1. dataStream.Close()

    vom Ende weiter nach oben gesetzt. Hierhin:

    VB.NET-Quellcode

    1. Dim dataStream As System.IO.Stream = request.GetRequestStream()
    2. dataStream.Write(postdatabytes, 0, postdatabytes.Length)
    3. dataStream.Close()


    Irgendwann kam mir die Idee nach einem Update von VS 2017 zu suchen. Gab es tatsächlich. Nun läuft es auch in der Klasse, in der es ganz zu Beginn die Probleme gab.

    ..ganz vergessen:
    reg habe ich irgendwann in request umbenannt.
    --------
    Lieber inkompetent als inkontinent