Ich bin eine schreckliche Zeit zur Fehlerbehebung dieses Problem haben. Ich habe auch eine schreckliche Zeit, um es konsistent von einer Anwendung zur anderen zu reproduzieren..NET 4.5 Httpclient PUT oder POST über SSL nicht immer
Unter bestimmten Umständen, die ich nicht zu erkennen scheinen, so dass PUT
und POST
Anrufe die HttpClient
Ergebnisse in der folgenden Ausnahme verwenden.
Beim Senden der Anfrage ist ein Fehler aufgetreten.
Innerer Ausnahmefehler:
Die zugrunde liegende Verbindung wurde geschlossen: Beim Senden ist ein unerwarteter Fehler aufgetreten.Innerer Ausnahmefehler:
Dieser Vorgang kann für ein abgeschlossenes asynchrones Ergebnisobjekt nicht ausgeführt werden.
Alles scheint mit HTTP zu funktionieren, dies geschieht nur auf HTTPS.
Zertifikate gültig sind, aber ich habe versucht, die ServicePointManager.ServerCertificateValidationCallback += (s, c, ch, es) => true;
Einstellung Ich habe versucht Einstellung client.DefaultRequestHeaders.ExpectContinue = false;
ich versucht habe, was wie ein von Header im Bereich Millionen, andere Dinge scheint, Authentifizierung etc.
Hat jemand eine Idee, was ich noch überprüfen kann, versuchen, etc?
Code-Snippet:
// this is my registration in my IoC container...
var handler = new HttpClientHandler
{
UseDefaultCredentials = true,
Credentials = CredentialCache.DefaultNetworkCredentials,
};
var client = HttpClientFactory.Create(handler);
client.BaseAddress = new Uri(Properties.Settings.Default.BaseUrl);
client.DefaultRequestHeaders.Add("X-CustomHeader", "value");
// _client is constructor injected into my class...
var response = await _client.PutAsJsonAsync("api/resource/" + id, model).ConfigureAwait(false);
response.EnsureSuccessStatusCode(); // <-- never executes...
UPDATE:
Wenn ich die ConfigureAwait(false)
ausziehen es funktioniert gut.
Hinweis, dies ist eine WPF-Anwendung, speziell, das ist eine Visual Studio-Erweiterung. Allerdings muß ich mit dem exakt gleichen Problem eine ASP.NET MVC 4-Anwendung habe, und dass die Anwendung nicht ConfigureAwait(false)
überhaupt nicht nennen ...
UPDATE 2:
ich den Code-Snippet aktualisiert, um die Instanziierung der Klasse HttpClient
. Das einzige, was nicht im Code-Snippet enthalten ist, sind der Modelltyp und die Deklaration. Es sollte irrelevant sein, da es sich um eine serialisierbare Klasse mit allen automatischen Eigenschaften ohne komplexe Typen handelt.
UPDATE 3:
Ich weiß nicht, ob dies relevant ist, aber ich habe ein paar Dinge gefunden, die mir seltsam aussehen.
Wenn Sie den obigen Code ausgeführt wird, in Fiddler, erhalte ich eine 401
auf dem POST
um 2 CONNECT
‚s an, der in den folgenden HTTP-Antworten ergeben:
HTTP/1.1 200 Verbindung hergestellt
Anschluss: schließen
UPDATE 4:
änderte ich meine IoC Registrierungscode, dies zu sein:
var handler = new HttpClientHandler
{
UseDefaultCredentials = true,
Credentials = CredentialCache.DefaultCredentials,
};
var client = HttpClientFactory.Create(handler);
client.BaseAddress = new Uri(Properties.Settings.Default.BaseUrl);
client.DefaultRequestHeaders.Add("X-CustomHeader", "value");
und jetzt ist es nicht, aber wenn ich öffnen Fiddler und lass es den Verkehr entschlüsseln ... es funktioniert!
UPDATE 5:
Ich glaube, das ein Server-Problem sein muss, oder ein cert Problem. Irgendwelche Tipps auf, was von hier zu prüfen ist, würden sehr geschätzt. Zertifikate sind gültig und werden von einer vertrauenswürdigen Zertifizierungsstelle ausgestellt.
UPDATE 6:
Weitere Fehlersuche und Fehlerbehebung. Die Ausnahme tritt auf, bevor die ServicePointManager
CertificateValidationCallback
aufgerufen wird.
Zeigen Sie einen Auszug des tatsächlichen Sendecodes. –
Hinzugefügt Code-Snippet, aber es ist wirklich nur eine einfache Verwendung. Nichts Außergewöhnliches. – Adam
Verfügen Sie über _client, bevor die Anforderung abgeschlossen ist? Kannst du eine minimale Repro posten? –