Laden...

C# Webrequest SecurityProtocol Global setzen

Letzter Beitrag vor 20 Tagen 4 Posts 286 Views
C# Webrequest SecurityProtocol Global setzen

Hallo,

wir haben eine Klasse mit der wir mehrere WebRequest versenden.

Lieder kommt es immer wieder dazu, dass wir einen Fehler bekommen:

System.Net.WebException: Die zugrunde liegende Verbindung wurde geschlossen: Für den geschützten SSL/TLS-Kanal konnte keine Vertrauensstellung hergestellt werden.

SSL wird Global in der Klasse gesetzt. Kann es sein, das diese Globale Einstellung nach eienr gewissen Zeit verloren geht?

Es funktioniert auch eine Zeit lang, aber irgendwann kommt der Fehler, ohne ein wirkliches Muster zu erkennen

Wir verbinden uns intern mit einer Firewall, daher gibt es kein Zertifikat für die SSL verbindung, was aber doch kein Problem sein sollte?

public class WebHelper {
    private string host = string.Empty;
    private int port = 4444;
    private string username = string.Empty;
    private string password = string.Empty;
    
    public WebHelper(string host, int port, string username, string password) {
        this.host = host;
        this.port = port;
        this.username = username;
        this.password = password;

        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3 | (SecurityProtocolType)3072;
    }
    
    private string sendAPIRequest(string requestBlock) {

        string xmlResponse = string.Empty;

        var request = (HttpWebRequest)WebRequest.Create("...")
        
        request.Method = "GET";
        request.ContentType = "application/xml; charset=UTF-8";
        request.Timeout = 40000;

        string xmlContent = string.Empty;

        using (HttpWebResponse rsp = (HttpWebResponse)request.GetResponse()) {
            ...
        };
    }

Vielen Dank schonmal

SSL wird Global in der Klasse gesetzt. Kann es sein, das diese Globale Einstellung nach eienr gewissen Zeit verloren geht?

Nein, kann nicht sein.

Aber die WebRequest-Klasse ist seit >10 Jahren veraltet; verwende den HttpClient. Beachte auch die Hinweise in der Doku, wie

HttpClient is intended to be instantiated once and re-used throughout the life of an application. Instantiating an HttpClient class for every request will exhaust the number of sockets available under heavy loads. This will result in SocketException errors.

Und verwende asynchrone Programmierung bei sowas. Das ist essentiell.

Vielen Dank für die Antwort.

Und verwende asynchrone Programmierung bei sowas. Das ist essentiell.

Leider müssen wir aus verschiedenen Gründen weiterhin WebRequest. Außerdem soll die Funktion nicht asynchron sein, da wir auf die Antwort warten müssen.

Es wundert mich eben, warum der Befehl einmal ausgeführt wird und ein anderes mal nicht. Obwohl die Einstellung Global gesetzt ist und die Klasse weiter genutzt wird.

Asynchroner Code hat nichts mit „nicht warten“ zutun, sondern dass keine Ressourcen blockiert werden.
Auch mit asynchronem Code kannst du genauso auf die Antworten „warten“. Deswegen gibt es async/await.


Willst du den WebRquest weiter verwenden, so hast du in Zukunft Support-Issues gewisser Szenarien.

Obwohl die Einstellung Global gesetzt ist und die Klasse weiter genutzt wird.

Global heisst halt auch immer, dass andere Funktionalitäten Dein Zeug beeinflussen können.