HTTPWebRequest führt zu: "unerwarteten Fehler beim senden"

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

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

    HTTPWebRequest führt zu: "unerwarteten Fehler beim senden"

    Ein herzliches Hallo an die Leser meines Problems ,

    ich versuche um, die Authentizität einer Anmeldung zu prüfen, auf einen REST Service einer Website zuzugreifen bei der alle potentiellen Personen, die sich anmelden könnten, zwangsläufig bereits registriert sind. Ich habe anhand der Hilfetexte der Seite den Aufbau der Adresse zusammengestellt. Wenn ich diese direkt in die Adresszeile eines Browser eingebe dann funktioniert es. Ich bekomme den Inhalt einer JSON Datei angezeigt, welche mir zeigt, dass die Anmeldung erfolgreich war.
    Wenn ich das ganze im Code mit einem HTTPWebRequest mache, dann funktioniert es nicht und bricht in der Zeile mit dem GetResponse ab mit dem Fehler:
    Die zugrunde liegende Verbindung wurde geschlossen: Unerwarteter Fehler beim Senden..
    InnerException: "Von der Übertragungsverbindung können keine Daten gelesen werden: Eine vorhandene Verbindung wurde vom Remotehost geschlossen."
    Ich verstehe nicht wo ich etwas falsch mache, kann mir jemand auf die Sprünge helfen und den Fehler im Code finden???
    Vielen Dank schon einmal im voraus...

    Der Code:

    Quellcode

    1. Private Sub BtnGET_Click(sender As Object, e As EventArgs) Handles btnGET.Click
    2. Dim Request As HttpWebRequest = CType(WebRequest.Create("https://www2.hi-tier.de/Hittest3/api/hit/BETRKOM?columns=BNR15&bnr=010000000001&mbn=0&pin=900001&cacheTimeout=10"), HttpWebRequest)
    3. Request.Method = "GET"
    4. Request.ContentType = "application/json; charset=utf-8"
    5. Request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729"
    6. Dim Response As HttpWebResponse = Request.GetResponse()
    7. Dim reader As New StreamReader(Response.GetResponseStream())
    8. Dim ServerResponse As String = reader.ReadToEnd()
    9. reader.Close()
    10. Response.Close()
    11. End Sub


    PS: Die Zugangsdaten sind Testzugangsdaten von der Website, also bereits öffentlich.
    Ich bin jetzt mit dem obigen Problem etwas weiter gekommen. Es gab auf Github ein Projekt in C# das funktionierte. Ich habe das mal etwas eingedampft (funktioniert aber immer noch!). Was ich nicht verstehe, wenn ich den Code in ein andres Projekt kopiere (C#) oder in VB umwandle und dann weiter nutze, dann geht es nicht. Es tritt wieder der oben genannte Fehler auf. Hier der Code in C#:

    C#-Quellcode

    1. ​using System;
    2. using System.Collections.Generic;
    3. using System.Net;
    4. using System.Net.Http;
    5. using System.Windows.Forms;
    6. using System.Net.Http.Headers;
    7. class Program
    8. {
    9. static void Main(string[] args)
    10. {
    11. RestClient objService = new RestClient("https://www2.hi-tier.de/HitTest3/", "/api/hit/");
    12. HttpResponseMessage objResponse = null;
    13. String strContent = objService.sendGET<String>("", out objResponse);
    14. if (objResponse.IsSuccessStatusCode)
    15. {
    16. objResponse = null;
    17. Dictionary<String, Object> objContent = objService.sendGET<Dictionary<String, object>>(
    18. "BETRKOM?bnr=090000000015&mbn=0&pin=900015&cacheTimeout=20&columns=BNR15", out objResponse);
    19. if (objResponse.IsSuccessStatusCode)
    20. {
    21. ////JObject objEntityDaten = (JObject)objContent["daten"];
    22. var asString = string.Join(Environment.NewLine, objContent);
    23. if (asString.Contains("BETRKOM"))
    24. {
    25. MessageBox.Show("Anmeldung erfolgreich");
    26. }
    27. }
    28. }
    29. }
    30. }
    31. public class RestClient
    32. {
    33. private HttpClient objThisUA;
    34. private String strThisBasePath;
    35. public RestClient(string pobjBaseUrl, string pobjBasePath)
    36. {
    37. strThisBasePath = (pobjBasePath == null) ? "" : pobjBasePath;
    38. objThisUA = new HttpClient();
    39. objThisUA.BaseAddress = new Uri(pobjBaseUrl + strThisBasePath.Substring(strThisBasePath.StartsWith("/") ? 1 : 0));
    40. //objThisUA.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    41. }
    42. public T sendGET<T>(string pobjUri, out HttpResponseMessage pobjResponse)
    43. {
    44. pobjResponse = null;
    45. T objContent = default(T);
    46. pobjResponse = objThisUA.GetAsync(pobjUri).Result;
    47. if (pobjResponse.IsSuccessStatusCode)
    48. {
    49. objContent = pobjResponse.Content.ReadAsAsync<T>().Result;
    50. Dictionary<String, Object> objDictContent = objContent as Dictionary<String, Object>;
    51. }
    52. else
    53. {
    54. Dictionary<String, Object> objErrors = pobjResponse.Content.ReadAsAsync<Dictionary<String, Object>>().Result;
    55. objContent = default(T);
    56. }
    57. return objContent;
    58. }
    59. //--------------------------------------------------------------------
    60. }


    und der Code in VB.NET:

    VB.NET-Quellcode

    1. ​Imports System.Net
    2. Imports System.Net.Http
    3. Imports System.Windows.Forms
    4. Imports System.Net.Http.Headers
    5. Imports System.Runtime.InteropServices
    6. Class Program
    7. Public Shared Sub Main(ByVal args As String())
    8. ServicePointManager.ServerCertificateValidationCallback = Function(sender, cert, chain, sslPolicyErrors) True
    9. Dim objService As RestClient = New RestClient("https://www2.hi-tier.de/HitTest3/", "/api/hit/")
    10. Dim objResponse As HttpResponseMessage = Nothing
    11. Dim strContent As String = objService.sendGET(Of String)("", objResponse)
    12. If objResponse.IsSuccessStatusCode Then
    13. objResponse = Nothing
    14. Dim objContent As Dictionary(Of String, Object) = objService.sendGET(Of Dictionary(Of String, Object))("BETRKOM?bnr=090000000015&mbn=0&pin=900015&cacheTimeout=20&columns=BNR15", objResponse)
    15. If objResponse.IsSuccessStatusCode Then
    16. Dim asString = String.Join(Environment.NewLine, objContent)
    17. If (asString.Contains("BETRKOM")) Then
    18. MessageBox.Show("Anmeldung erfolgreich")
    19. End If
    20. End If
    21. End If
    22. End Sub
    23. End Class
    24. Public Class RestClient
    25. Private objThisUA As HttpClient
    26. Private strThisBasePath As String
    27. Public Sub New(ByVal pobjBaseUrl As String, ByVal pobjBasePath As String)
    28. strThisBasePath = If((pobjBasePath Is Nothing), "", pobjBasePath)
    29. objThisUA = New HttpClient()
    30. objThisUA.BaseAddress = New Uri(pobjBaseUrl & strThisBasePath.Substring(If(strThisBasePath.StartsWith("/"), 1, 0)))
    31. objThisUA.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json"))
    32. End Sub
    33. Public Function sendGET(Of T)(ByVal pobjUri As String, <Out> ByRef pobjResponse As HttpResponseMessage) As T
    34. pobjResponse = Nothing
    35. Dim objContent As T = Nothing
    36. pobjResponse = objThisUA.GetAsync(pobjUri).Result
    37. If pobjResponse.IsSuccessStatusCode Then
    38. objContent = pobjResponse.Content.ReadAsAsync(Of T)().Result
    39. Dim objDictContent As Dictionary(Of String, Object) = TryCast(objContent, Dictionary(Of String, Object))
    40. Else
    41. Dim objErrors As Dictionary(Of String, Object) = pobjResponse.Content.ReadAsAsync(Of Dictionary(Of String, Object))().Result
    42. objContent = Nothing
    43. End If
    44. Return objContent
    45. End Function
    46. End Class


    Hat jemand vielleicht eine Idee woran es liegen könnte das es nur in der C# Version geht und sonst nicht??? Abbrechen tut er in der Zeile beim Befehl GetAsync.
    Der VB.NET Code läuft bei mir ohne Fehler durch.

    Das Einzige was ich manuell machen musste war ein "install-package Microsoft.AspNet.WebApi.Client" im PM.

    Ich habe für den Test eine Windows-Forms-Anwendung mit Zielframework 4.7 genutzt.

    Nachtrag: Zeile 9. hab ich bei mir gelöscht

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „korni“ ()

    Danke für den Test. Ich verstehe die Welt allmählich nicht mehr. Ich habe auch das Framework 4.7 geladen. Die Zeile 9 gelöscht und bei mir geht es nicht. Kann so etwas an Einstellungen auf dem Rechner liegen, die C# und VB unterschiedliche behandeln???
    Hallo korni,
    Vielen Dank für das übersenden deines Projektes. Es ist echt zum Mäuse melken, aber es will bei mir nicht laufen.
    Ich habe die Exe noch auf einem anderen PC (anderes Netzwerk, andere Virensoftware) ausgeführt.
    Leider die gleiche Fehlermeldung.
    Hallo EaranMaleasi,

    Danke, dass du dich diesem Problem annimmst.
    Der einzige Code der funktioniert ist der C# Code. C# ist nicht meine Welt, trotzdem habe ich versucht
    den Code in ein neues Konsolenprojekt zu kopieren und er bricht mit einem Fehler ab. In VB klappt es ebenfalls nicht.
    Und Nein, es passiert nichts weiter im Projekt, nur das was ich gepostet habe.
    Versuch es in Anstelle Zeile 9 mal mit:

    VB.NET-Quellcode

    1. System.Net.ServicePointManager.SecurityProtocol = System.Net.ServicePointManager.SecurityProtocol or SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12


    Nachtrag: Konnte den Fehler nachstellen und zwar indem ich das Projekt auf das Zielframework 4.5 umgestellt habe.
    Kommt genau der selbe Fehler beim "GetAsync". Der obige Code behebt diesen dann bei mir.

    (Voraussetzung ist natürlich das du tatsächlich das 4.5'er Framework nutzt.)

    Hintergrund kann man hier nachlesen: stackoverflow.com/questions/28…curityprotocol-in-net-4-5

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „korni“ ()

    ICH BIN BEGEISTERT!

    Vielen Dank.

    Was hat mich dieser Mist für Zeit gekostet!

    Nachdem der Code durch deine Hilfe endlich funktioniert, muss ich das ganze nur noch auf ASPNET ummünzen.
    Letztendlich sollen Anwender sich auf einer Seite anmelden und über deinen Aufruf zu der Seite im Code Authentifizieren.
    Dort habe ich parallel herum experimentiert und habe noch das Problem, das der Http.HttpClient sich nicht in die Website einbinden lässt.