Ich versuche herauszufinden, warum ein Aufruf an einen Restful-API-Endpunkt fehlschlägt, wenn ich HTTPS, aber nicht HTTP von einem Windows Server 2012 R2 verwende. Derselbe HTTPS-Aufruf funktioniert, wenn ich die Anwendung lokal auf meinem Laptop (Windows 7) ausführe.Die zugrunde liegende Verbindung wurde geschlossen - API-Endpunkt-Anruf schlägt fehl
Leider kann ich Fiddler nicht dazu bringen, die Aufrufe anzuzeigen, die von der Anwendung auf dem Web-Server an der API vorgenommen werden. Die AppContainer Loopback Exemption Utility-Fehler versuchen, die AppContainers-Liste aufzulisten. Der Server ist auch nach Gruppenrichtlinien gesperrt. Daher kann ich die Firewall nicht ausschalten, um das Fiddler-Problem zu lösen.
Der Aufruf der API ist:
public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)
{
client = new HttpClient();
// removed code for setting ignoreCertErrors and environmentName
if (ignoreCertErrors && environmentName.ToUpper() != "PROD")
{
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
}
return client.SendAsync(request);
}
Fehler erhalten:
================================================================= Message: The underlying connection was closed: An unexpected error occurred on a send. Stack Trace:
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResultar)================================================================= Message: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. Stack Trace:
at System.Net.TlsStream.EndWrite(IAsyncResult asyncResult)
at System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)================================================================= Message: An existing connection was forcibly closed by the remote host Stack Trace:
at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)=================================================================
Wie genauer erhalten können? Ich versuche, Low-Level-Tools wie Wireshark zu vermeiden, ich hoffe, es gibt Option Trace/Log/Capture mehr Details über die Anwendung Aufrufe an API, die fehlschlagen.
UPDATE - Hier ist die Trace-Informationen, wenn es fehlschlägt:
System.Net Information: 0 : [2292] SecureChannel#49584532::.ctor(hostname=XX.XX.com, clientCertificates=0, encryptionPolicy=RequireEncryption)
System.Net Information: 0 : [2292] SecureChannel#49584532 - Left with 0 client certificates to choose from.
System.Net Information: 0 : [2292] Using the cached credential handle. System.Net Information: 0 : [2292] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = (null), targetName = XX.XX.com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation) System.Net Information: 0 : [2292] InitializeSecurityContext(In-Buffer length=0, Out-Buffer length=178, returned code=ContinueNeeded).
System.Net.Sockets Verbose: 0 : [2292] Socket#14347911::BeginSend()
System.Net.Sockets Verbose: 0 : [2292] Exiting Socket#14347911::BeginSend() -> OverlappedAsyncResult#19699911 System.Net.Sockets Verbose: 0 : [2292] Data from Socket#14347911::PostCompletion
[ Removed ]
System.Net.Sockets Verbose: 0 : [2292] Socket#14347911::EndSend(OverlappedAsyncResult#19699911)
System.Net.Sockets Verbose: 0 : [2292] Exiting Socket#14347911::EndSend() -> Int32#178
System.Net.Sockets Verbose: 0 : [2292] Socket#14347911::BeginReceive()
System.Net.Sockets Verbose: 0 : [2292] Exiting Socket#14347911::BeginReceive() -> OverlappedAsyncResult#2389992
System.Net.Sockets Verbose: 0 : [2292] Socket#14347911::EndReceive(OverlappedAsyncResult#2389992)
System.Net.Sockets Error: 0 : [2292] Socket#14347911::UpdateStatusAfterSocketError() - ConnectionReset
System.Net.Sockets Error: 0 : [2292] Exception in Socket#14347911::EndReceive - An existing connection was forcibly closed by the remote host. System.Net.Sockets Verbose: 0 : [2292] Exiting Socket#14347911::EndReceive() -> Int32#0
System.Net.Sockets Verbose: 0 : [2292] Socket#14
Der Aufruf an die API ist wahrscheinlich fehlgeschlagen. Wenn Sie eine Verbindung mit dem Server herstellen, werden Sie mit Gastberechtigungen ausgeführt, die normalerweise nicht über die Anmeldeinformationen zum Ausführen einer API auf dem Server verfügen. Die API muss auf dem Server installiert werden, um mit Administratorrechten ausgeführt zu werden. Um zu überprüfen, ob ich korrekt bin, würde ich die Ereignisanzeige auf dem Server überprüfen, um weitere Details zu dem Fehler zu erhalten. – jdweng
Derselbe Aufruf der API über HTTP funktioniert, aber wenn ich den API-URI mit HTTPS umschalte, werden die obigen Fehler ausgegeben. – Josh
Testen Sie auf Null-Antworten? Nicht sicher die Ursache, aber ich vermute, dass Sie möglicherweise leere Pakete erhalten. – jdweng