Entwickler-Ecke
Basistechnologien - C# + nativer DLL Export: HttpClient kann kein SSL (mit Demo)
jaenicke - Di 14.06.22 12:26
Titel: C# + nativer DLL Export: HttpClient kann kein SSL (mit Demo)
Hallo an alle,
nun stelle ich nach langer Zeit auch mal wieder eine Frage. ;-)
Gegeben ist folgende (für die Demo stark vereinfachte) Konstellation:
- Visual Studio 2022
- C# Klassenbibliothek mit DllExport via NuGet geladen
- Nativ exportierte DLL-Funktion, in der ein HttpClient eine Datei via SSL herunterlädt
- Delphi-Programm, das diese DLL lädt und die Funktion ausführt
Leider bekomme ich dabei einen SSL Fehler:
Zitat: |
---> (Interne Ausnahme #0) System.Net.Http.HttpRequestException: Fehler beim Senden der Anforderung. ---> System.Net.WebException: Die Anfrage wurde abgebrochen: Es konnte kein geschützter SSL/TLS-Kanal erstellt werden.. |
Das Interessante daran ist nun, dass der exakt identische Quelltext in einer Windows Forms App (identisch mit .NET Framework 4.8 usw.) normal funktioniert:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| MessageBox.Show("Vorher"); HttpClient _httpClientDefault = new HttpClient(); try { string DD_jwt = _httpClientDefault.GetStringAsync($"https://file-examples.com/storage/fe6869c4db62a7ab6a021f9/2017/02/file_example_XML_24kb.xml").Result; MessageBox.Show("Ergebnis: " + DD_jwt); } catch (Exception ex) { MessageBox.Show("Fehler: " + ex.ToString()); } MessageBox.Show("Nachher"); |
Die ausführbaren Binaries sind dabei, falls jemand z.B. das Delphiprojekt nicht selbst kompilieren kann / möchte. Es liegt fertig kompiliert unter:
Zitat: |
HttpClientError\DelphiHost\Win32\Release |
Dieses lädt die C#-DLL aus, die ebenfalls beiliegt:
Zitat: |
HttpClientError\HttpClientErrorLib\HttpClientErrorLib\bin\Debug\net48 |
Die funktionierende C# Anwendung liegt hier:
Zitat: |
HttpClientError\HttpClientErrorLib\HttpClientErrorExe\bin\Debug |
Es sind alle Projekte und Quelltexte mit dabei, es sollte sich also problemlos nachvollziehen lassen. Dafür reicht es den Knopf in der Delphi-Anwendung bzw. der C# Anwendung zu drücken.
Leider habe ich nicht die leiseste Idee was hier das Problem sein kann. Ihr vielleicht?
Danke schon einmal für eure Hilfe!
Viele Grüße
Sebastian
jaenicke - Di 14.06.22 14:20
Danke schon einmal!
Th69 hat folgendes geschrieben : |
ich erhalte auch bei deiner Delphi-Version den SSL/TLS-Fehler, während die C#-Applikation die XML-Datei anzeigt. |
Das ist genau mein Problem:
Wenn ich in C# eine Exe erstelle, klappt es, erstelle ich eine Klassenbibliothek mit DLL Export, der aus dem Delphiprogramm heraus aufgerufen wird, geht es nicht.
Das schaue ich mir an.
// EDIT: Der Callback macht leider keinen Unterschied.
// EDIT2:
Aber tatsächlich klappt es, wenn ich die Versionen angebe. Da scheint dann wohl ein anderer Standardwert verwendet zu werden.
Vielen Dank, das klappt nun!
Th69 hat folgendes geschrieben : |
Evtl. wird bei dem Delphi-Programm (als Host-Programm) eine andere SSL-Version verwendet? |
Das ist exakt der gleiche Quelltext. Delphi lädt lediglich die in C# geschriebene DLL und ruft die Funktion darin auf. Du kannst diese DLL auch selbst neu kompilieren. Alle drei Projekte (Delphi-Host, C#-DLL und C#-Exe) liegen in dem Archiv. In Delphi selbst passiert gar nichts außer der Aufruf der DLL Funktion.
Ralf Jansen - Di 14.06.22 15:15
Das Framework wählt so aus irgendeinem Grund die alten Defaults für Frameworks kleiner 4.5.1. als wüsste es nicht das es das Framework 4.8 benutzen sollte.
Per config lässt sich das Framework aber wieder in die richtige Richtung schubsen so das die Systemeinstellungen genutzt werden.
Folgendes als "DelphiHost.exe.config" sollte funktionieren.
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9:
| <?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" /> </startup> <runtime> <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"/> </runtime> </configuration> |
Th69 - Di 14.06.22 15:17
Schön, daß es jetzt funktioniert.
Und genau das meinte ich, daß jede der beiden Anwendungen unterschiedliche Standardwerte für die SSL-Version nutzt.
jaenicke - Di 14.06.22 23:27
Ralf Jansen hat folgendes geschrieben : |
Per config lässt sich das Framework aber wieder in die richtige Richtung schubsen so das die Systemeinstellungen genutzt werden.
Folgendes als "DelphiHost.exe.config" sollte funktionieren. |
Gut zu wissen, darauf wäre ich in dem Zusammenhang nicht gekommen.
Ja, vielen Dank noch einmal an euch beide.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!