2013-06-14 12 views
10

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 ServicePointManagerCertificateValidationCallback aufgerufen wird.

+0

Zeigen Sie einen Auszug des tatsächlichen Sendecodes. –

+0

Hinzugefügt Code-Snippet, aber es ist wirklich nur eine einfache Verwendung. Nichts Außergewöhnliches. – Adam

+0

Verfügen Sie über _client, bevor die Anforderung abgeschlossen ist? Kannst du eine minimale Repro posten? –

Antwort

2

Ich habe gerade ein ähnliches Problem mit HttpClient behoben. Es stellte sich heraus, dass ich während des SSL-Handshakes eine SNI-Warnung erhalten hatte, die dazu führte, dass HttpClient auf unbestimmte Zeit gesperrt wurde. Versuchen Sie, WireShark/tcpdump auszuführen, und sehen Sie, ob Sie eine TLSv1 Unknowned Name-Warnung oder eine andere Art von Handshake-Warnung erhalten. HttpClient scheint diese nicht ordnungsgemäß basierend auf meinen Tests zu behandeln.

0

Ich hatte das gleiche Problem und ich löste es die letzte Aktualisierung des .NET-Framework (4.5) installieren.