Mein Problem:
Ich habe eine Webapp (.NET 4.5.1), die mehrere Aufrufe an externe Webservices ausführt. Einige der Dienste kommunizieren nur über SSL und andere nur über TSL.
Ich weiß, dass ServicePointManager.SecurityProtocol aus irgendeinem Grund statisch global für das appdomin gesetzt werden kann (Warum global ich keine Ahnung habe), aber da mehrere Aufrufe gleichzeitig bei verschiedenen externen Diensten in verschiedenen Threads auftreten können - Ich kann nicht einfach das SecurityProtcol für die appdomain für jeden Serviceanruf ändern.
Frage:
Wie soll ich das in einer Multithread-Web-App-Umgebung handhaben? Soll ich Serviceanrufe in verschiedenen Appdomains erstellen, in denen ich SecurityProtocol einstellen kann? Und wenn ja - wie soll ich das machen?
Ich hatte dieses Problem und fand diese Lösung, die für mich funktionierte.
Ich benutze einfach ServicePointManager
, um Verbindungszertifikate zu behandeln
Um mit verschiedenen Anfragen umzugehen, hatte ich einen Wörterbuch-Mapping-Server mit URLs für eine Aufgabe. Jede Aufgabe läuft asynchron, was bedeutet, dass ich nicht direkt mit Threads umgehen muss und in jedem System habe ich schließlich System.Net-Objekte verwendet. Nämlich, HttpWebRequest
, FtpWebRequest
und SmtpWebRequest
.
Jeder von ihnen hat eine Eigenschaft zum Aktivieren / Deaktivieren der SSL-Verbindung, aber alle haben mit der gleichen Methode gearbeitet, um Zertifikate zu validieren.
Von Microsoft:
public static SecurityProtocolType Sicherheitsprotokoll {get; einstellen; }
Diese Eigenschaft wählt die Version der SSL-Sicherheit (Secure Sockets Layer) oder der Transportschichtsicherheit aus (TLS) -Protokoll für neue Verbindungen, die das Secure Hypertext Transfer Protocol (HTTPS) & gt; nur Schema; bestehende Verbindungen werden nicht geändert.
Bitte beachten Sie: "Für neue Verbindungen verwenden ... bestehende Verbindungen werden nicht geändert"
Aktualisieren Sie diese Eigenschaft also kurz vor dem Öffnen einer neuen Verbindung.
Tags und Links c# multithreading web-services certificate