Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Laden einer XML-RSS-Feeds mit tIdHTTP endet mit 'Socket-Fehler # 10054' (https://www.delphipraxis.net/194179-laden-einer-xml-rss-feeds-mit-tidhttp-endet-mit-socket-fehler-10054-a.html)

Guido R. 25. Okt 2017 15:52

Laden einer XML-RSS-Feeds mit tIdHTTP endet mit 'Socket-Fehler # 10054'
 
Hallo !

Ich möchte den Verfügbarkeitsstatus der Elster-Server über eine von Elster herausgegebene XML-Datei (RSS) überprüfen.
Der Link ist "https://www.elster.de/elsterweb/serverstatus_rss.xml"
Über mehrere Browser kann ich die Datei problemlos aufrufen. Nun wollte ich die XML mit tIdHTTP auslesen um später bestimmte Informationen herauszulesen.
Der Aufruf über :
Code:
 XMLStr := IdHTTP1.Get('https://www.elster.de/extern/serverstatus_rss.xml');
schlägt jedoch mit der Meldung "Socket-Fehler # 10054Die Verbindung wurde vom Peer zurückgesetzt." fehl.
Hat jemand eine Idee, was ich ändern muss?

Gruß
Guido

P.S.: Delphi XE10.2

nahpets 25. Okt 2017 16:32

AW: Laden einer XML-RSS-Feeds mit tIdHTTP endet mit 'Socket-Fehler # 10054'
 
Guckst Du bite mal hier: http://www.echtzeithilfe.de/fixed-so...tidhttp-delphi

In meinem RSS-Reader mache ich das prinzipiell in dieser Art:
Delphi-Quellcode:
Try
  HTTP.AllowCookies := True;
  HTTP.MaxAuthRetries := 1;
  HTTP.RedirectMaximum := 1;
  HTTP.HandleRedirects := True;
  HTTP.ProxyParams.BasicAuthentication := False;
  HTTP.ProxyParams.ProxyPort := 0;
  HTTP.Request.ContentLength := -1;
  HTTP.Request.Accept := 'text/html, */*';
  HTTP.Request.BasicAuthentication := True;
  // Hier ist das Indy-Original "veraltet" und wird von manchen Servern abgelehnt.
  HTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 5.1; rv:52.0) Gecko/20100101 Firefox/52.0';
  HTTP.HTTPOptions := [hoInProcessAuth, hoKeepOrigProtocol, hoForceEncodeParams];
  HTTP.Get('https://www.elster.de/extern/serverstatus_rss.xml',IrgendeineStringliste);
  HTTP.Disconnect(True);
  HTTP.IOHandler.InputBuffer.Clear;
except
  on e : Exception do begin
    HTTP.Disconnect(True);
    HTTP.IOHandler.InputBuffer.Clear;
   // weitere Fehlerverarbeitung.
  end;
end;
(nur hinkopiert und nicht getestet.)

Ansonsten die Suchmaschine Deiner Wahl mit "socket 10054 indy" füttern. Es gibt etliche Hinweise, welcher davon genau Dein Problem lösen kann (und ob überhaupt) vermag ich nicht zu beurteilen.

Guido R. 25. Okt 2017 16:55

AW: Laden einer XML-RSS-Feeds mit tIdHTTP endet mit 'Socket-Fehler # 10054'
 
Ja - Die Seite habe ich bei meinen Recherchen vorher schon gefunden.
Hat leider nichts gebracht.
Grundsätzlich funktioniert mein Ansatz ja auch.
Wenn ich z.B. die Avira News "https://www.avira.com/de/news.xml" laden möchte klappt das problemlos.
Einzige erforderliche Änderung an den Grundeinstellungen von IdHTTP dafür ist
Code:
HandleRedirects := True;
Nur auf der Elster-Seite klappt's nicht.:wall:

nahpets 25. Okt 2017 17:37

AW: Laden einer XML-RSS-Feeds mit tIdHTTP endet mit 'Socket-Fehler # 10054'
 
Hast Du Deiner idHTTP-Komponente 'ne TIdSSLIOHandlerSocketOpenSSL zugewiesen? Wenn nein, hole das bitte nach.

Bei der setzt Du dann bitte
Delphi-Quellcode:
SSLOptions.Method := sslvSSLv23;
.
Jetzt sollte als Ergebnis vom Get erstmal ein HTTP/1.1 301 Moved Permanently kommen.

Du wirst dann umgeleitet nach https://www.elster.de/elsterweb/serverstatus_rss.xml

Ein Ergebnis bekomme ich mit der ersten Url (der von Dir geposteten) erst, wenn ich
Delphi-Quellcode:
RedirectMaximum := 2;
setze.

Guido R. 26. Okt 2017 12:54

AW: Laden einer XML-RSS-Feeds mit tIdHTTP endet mit 'Socket-Fehler # 10054'
 
Und das klappt bei Dir ?

Hab's genauso gemacht. Habe auch die Einstellungen Deines ersten Beitrags probiert.
Nix - Genau die gleiche Meldung. Hab dann statt tIdHTTP mal tNetHTTPClient probiert.
Andere Fehlermeldung - (12030 Serververbindung beendet) - gleiches Ergebnis ...

Hab zum Spaß mal eine tWebBrowser - Komponente auf die Form gelegt und mit
Delphi-Quellcode:
 WebBrowser1.URL='https://www.elster.de/extern/serverstatus_rss.xml';
 WebBrowser1.Navigate;
aufgerufen. Dann wird die XML im tWebBrowser korrekt angezeigt.

:glaskugel: Es ist zum Verzweifeln...

nahpets 26. Okt 2017 13:07

AW: Laden einer XML-RSS-Feeds mit tIdHTTP endet mit 'Socket-Fehler # 10054'
 
Anhängen ein bei mir funktionierendes Minimalprogramm.

Guido R. 26. Okt 2017 13:35

AW: Laden einer XML-RSS-Feeds mit tIdHTTP endet mit 'Socket-Fehler # 10054'
 
Danke für das Testprogramm.
Hab's ausprobiert. - Gleiches Ergebnis.

Also entweder werde ich inzwischen von Elster irgendwie geblockt - allerdings funktioniert ja der Browseraufruf der Seite und auch Deine EXE - ,
oder irgendwas wurde an den Indys übelst abgeändert und keiner hat's mir gesagt.:wiejetzt:
Ich probiere Deinen Code heute Abend mal zu hause mit einer älteren Delphi/Indy Version aus...

Guido R. 26. Okt 2017 14:03

AW: Laden einer XML-RSS-Feeds mit tIdHTTP endet mit 'Socket-Fehler # 10054'
 
Gerade ausprobiert - Unter XE2 funktioniert sowohl Deine Version, als auch mein Einzeiler-Minimal-Projekt...
Delphi-Quellcode:
Memo1.Lines.Text := idHTTP1.Get('https://www.elster.de/extern/serverstatus_rss.xml');
Irgendwas scheint da mit den Indys unter XE10.2 nicht zu stimmen.

ManBu 26. Okt 2017 14:59

AW: Laden einer XML-RSS-Feeds mit tIdHTTP endet mit 'Socket-Fehler # 10054'
 
Die ELSTER-Server unterstützen seit einiger Zeit nur noch TLS.

Wahrscheinlich hilft dir ein sslvTLSv1_2

nahpets 26. Okt 2017 15:23

AW: Laden einer XML-RSS-Feeds mit tIdHTTP endet mit 'Socket-Fehler # 10054'
 
Mein Programm funktioniert mit SSLOptions.Method := sslvSSLv23,

sslvTLSv1 führt zu dieser Fehlermeldung:
Code:
---------------------------
Project1
---------------------------
Socket Error # 10054
Connection reset by peer.
---------------------------
OK  
---------------------------
sslvSSLv2 endet mit der Meldung
Code:
---------------------------
Project1
---------------------------
Error creating SSL context.
---------------------------
OK  
---------------------------
sslvSSLv3 liefert mir
Code:
---------------------------
Project1
---------------------------
Error connecting with SSL.
EOF was observed that violates the protocol
---------------------------
OK  
---------------------------
Nur mit sslvSSLv23 bekomme ich dashier:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ELSTER-Serververfügbarkeit</title>
    <link>https://www.elster.de/elsterweb</link>
    <description>Verfügbarkeit ElsterOnline-Portal und authentifizierter bzw. nicht authentifizierter Dienste/Formulare</description>
    <language>de</language>
    <copyright>2014 Bayerisches Landesamt für Steuern - Dienststelle München, Projekt ELSTER</copyright>
    <lastBuildDate>Thu, 26 Oct 2017 12:33:12 GMT</lastBuildDate>
    <item>
      <title>Beschreibung</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>Zurzeit kann es beim Belegabruf unter Verwendung von Signaturkarten und ElsterSticks zu Problemen kommen. +++ Aufgrund von Wartungsarbeiten kann es am 27.10.2017 von 15:00 Uhr bis 16:00 Uhr bei der Steuerkontoabfrage in Baden-Württemberg zu Beeinträchtigungen kommen. +++ Aufgrund von Wartungsarbeiten steht am 27.10.2017 von 16:00 Uhr bis 17:30 Uhr die Steuerkontoabfrage in Bremen nicht zur Verfügung.</description>
    </item>
    <item>
      <title>Anmeldungssteuern (authentifiziert)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Anmeldungssteuern (ElsterOnline)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Jahressteuererklärungen (nicht authentifiziert)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Jahressteuererklärungen (authentifiziert)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Jahressteuererklärungen (ElsterOnline)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Bescheiddaten / Datenabholung (nicht authentifiziert)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Bescheiddaten / Datenabholung (authentifiziert)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Bescheiddaten / Datenabholung (ElsterOnline)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>ELStAM (An-, Ab- und Ummeldung von Arbeitnehmern)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Protokollabholung zur LStB (authentifiziert)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Protokollabholung zur LStB (ElsterOnline)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Lohnsteuerbescheinigungen (authentifiziert)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Lohnsteuerbescheinigungen (ElsterOnline)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Steuerkontoabfrage (authentifiziert)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>Hinweis</description>
    </item>
    <item>
      <title>Steuerkontoabfrage (ElsterOnline)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>Hinweis</description>
    </item>
    <item>
      <title>Belegabruf (authentifiziert)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>Hinweis</description>
    </item>
    <item>
      <title>Belegabruf (ElsterOnline)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Kapitalertragsteueranmeldung nach EStG/InvStG (authentifiziert)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Kapitalertragsteueranmeldung nach EStG/InvStG (ElsterOnline)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Registrierung ElsterOnline (ElsterOnline)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Abruf der eigenen ELStAM (ElsterOnline)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Einspruch (ElsterOnline)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Steuerabzug beschränkt Stpfl. §50a EStG (ElsterOnline)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
    <item>
      <title>Zusammenfassende Meldung (ElsterOnline)</title>
      <link>https://www.elster.de/elsterweb/svs</link>
      <description>OK</description>
    </item>
  </channel>
</rss>
Wenn ich nicht weiß, welche Methode ich für SSL nehmen soll, behelfe ich mir (sinngemäß) hiermit:
Delphi-Quellcode:
function MyGetSSLMethod(sUrl : String; var sMessage : String) : Integer;
var
  sMethod       : String;
  myIdSSLVersion : TIdSSLVersion;
begin
  Result := -1;
  for myIdSSLVersion := Low(TIdSSLVersion) to High(TIdSSLVersion) do begin
    SSL.SSLOptions.Method := myIdSSLVersion;
    sMethod := GetEnumName(TypeInfo(TIdSSLVersion), Ord(myIdSSLVersion));
    Try
      http.RedirectMaximum := 0;
      http.HandleRedirects := false;
      http.Get(sUrl);
      http.Disconnect(True);
      http.IOHandler.InputBuffer.Clear;
      sMessage := sMethod;
      Result  := Ord(myIdSSLVersion);
      break;
    except
      on e : Exception do begin
        case http.ResponseCode of
          301, 302 : begin
                       sMessage := http.ResponseText;
                       Result  := Ord(myIdSSLVersion);
                       break;
                     end;
        else
          sMessage := sMessage + #13 + e.Message;
        end;
        http.Disconnect(True);
        http.IOHandler.InputBuffer.Clear;
      end;
    end;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz