Gegeben: zwei C# -Konsolen-Apps auf verschiedenen Rechnern. Einer ist ein Client, einer ist ein Server. Der Client verwendet HttpClient.SendAsync, um eine Anforderung an den Server zu senden.C# request.GetClientCertificate() friert ein, wenn eine PUT/POST-Anforderung mit größerer Nutzlast verarbeitet wird
Jede an den Server gesendete Anfrage enthält ein Clientzertifikat, das an den Anforderungshandler angehängt wird, und jedes Mal, wenn der Server das Zertifikat zur Überprüfung mit GetClientCertificate() erhält.
Normalerweise funktioniert alles gut: alle GET-Aufrufe sowie PUT-Aufrufe mit geringer Payload (~ 4kb) durchlaufen konsequent.
Wenn Sie jedoch eine PUT-Anforderung mit einer größeren Nutzlast (z. B. ~ 40kb) ausführen, ruft GetClientCertificate() den serverseitigen Block auf und kehrt erst nach 2 Minuten zurück (was unsere Zeitüberschreitungsperiode ist). Das zurückgegebene Zertifikat ist null. Der Client meldet einen Fehler "SSL/TLS-Kanal kann nicht eingerichtet werden".
Es scheint, dass GetClientCertificate() einige zusätzliche Kommunikation, die ich nicht verstehe, und möchte einige Informationen darüber, was könnte Zeitüberschreitung sein. Zum Beispiel haben wir versucht, die Cert-Sperrung auf dem Server zu deaktivieren, aber das hat nicht geholfen. Ich frage mich auch, ob es für einen zwischengeschalteten Netzwerkknoten möglich ist, das Zertifikat zu löschen, und wie dies diagnostiziert werden kann.
Auch dieser Fehler passiert nicht konsequent. Manchmal kann es ein paar Dutzend Mal funktionieren, aber wenn es anfängt zu versagen, wird es weiterhin versagen. Dies könnte auf eine Art von Ressourcenlecks hindeuten, und es wäre schön zu wissen, was bei diesem Szenario passieren könnte. Wir verfügen über HTTP-Client, Handler und schließen den Zertifikatsspeicher.
Ich habe ähnliche Fragen zu StackOverflow gesehen, bei denen das Problem bestand, dass ASP.NET eine Konfiguration erfordert, die auf einem erfassten Kontext nicht fortgesetzt werden muss. Ich frage mich, ob ähnliche Bedenken auch auf Konsolen-Apps zutreffen könnten.
Danke für Ihre Hilfe!
Sie müssen uns mehr über Ihren Server erzählen. Es ist nicht klar, wie Sie dienen, obwohl es wahrscheinlich ist, dass es über 'HttpListener' ist. Vermutet du, was du willst? – spender
@spender, danke, ich hätte es tatsächlich geben sollen.Ich wollte die Frage so spezifisch wie möglich stellen und mich auf GetClientCertificate konzentrieren, ohne Sie irrelevanten Code durchlesen zu lassen, aber ich sehe Ihren Punkt jetzt. Wir verwenden OwinHttpListener und dann ruft Owin WebApp.Start() auf. Der Code ist ziemlich groß und schwer in einer Weise einzufügen, die sinnvoll wäre, aber wenn Sie Daten darüber benötigen, wie bestimmte Schritte ausgeführt werden oder welche Konfigurationseinstellungen vorgenommen werden, werde ich diese auf jeden Fall bereitstellen. – user2520968