L'échec sur HttpWebrequest avec intérieur exception de l'Authentification a échoué car le distant a fermé le flux de transport
À L'Aide De C#, .Net 4.5, je suis en train d'envoyer une requête web par le biais de HttpWebRequest sur un serveur distant. Veuillez voir le code ci-dessous.
J'ai essayé la plupart des solutions proposées par certains forums, mais je finis toujours avec le même message d'erreur. Consultez la trace de la pile ci-dessous.
L'erreur est générée lors de l'appel de la demande.GetReponse() la méthode.
Plus d'infos, en gros, je vais essayer d'appeler le reloadSslCertificate fonction de vmware vCenter composant est installé sur un serveur distant. Actuellement, l'erreur ne se produit que sur vCenter 5.5. Il fonctionne très bien dans les versions 5.1 et ci-dessous.
var uri = String.Format("https://{0}/some_url", serverName);
var request = (HttpWebRequest)WebRequest.Create(uri);
request.KeepAlive = true;
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.8");
request.Credentials = credential;
request.CookieContainer = cookieContainer;
var response = request.GetResponse();
Exception : System.Net.WebException: La connexion sous-jacente a été
fermée: Une erreur inattendue s'est produite lors de l'envoi. --->
Système.IO.IOException: l'Authentification a échoué car la partie à distance
a fermé le flux de transport. au
Système.Net.De sécurité.SslState.StartReadFrame(Byte[] buffer, Int32
readBytes, AsyncProtocolRequest asyncRequest) à
Système.Net.De sécurité.SslState.StartReceiveBlob(Byte[] buffer,
AsyncProtocolRequest asyncRequest) à
Système.Net.De sécurité.SslState.CheckCompletionBeforeNextReceive(ProtocolToken
message, AsyncProtocolRequest asyncRequest) à
Système.Net.De sécurité.SslState.StartSendBlob(Byte[] entrants, Int32
le comte, AsyncProtocolRequest asyncRequest) à
Système.Net.De sécurité.SslState.ForceAuthentication(Boolean receiveFirst,
Byte[] buffer, AsyncProtocolRequest asyncRequest) à
Système.Net.De sécurité.SslState.ProcessAuthentication(LazyAsyncResult
lazyResult) au Système.Net.TlsStream.CallProcessAuthentication(Objet
de l'état) à
Système.Le filetage.ExecutionContext.RunInternal(ExecutionContext
executionContext, ContextCallback rappel, état de l'Objet, Boolean
preserveSyncCtx) à
Système.Le filetage.ExecutionContext.Exécuter(ExecutionContext
executionContext, ContextCallback rappel, état de l'Objet, Boolean
preserveSyncCtx) à
Système.Le filetage.ExecutionContext.Exécuter(ExecutionContext
executionContext, ContextCallback rappel, l'état de l'Objet) à
Système.Net.TlsStream.ProcessAuthentication(LazyAsyncResult suite) au
Système.Net.TlsStream.Write(Byte[] buffer, Int32 offset, taille Int32) à
Système.Net.PooledStream.Write(Byte[] buffer, Int32 offset, taille Int32)
au Système.Net.ConnectStream.WriteHeaders(Boolean async) --- Fin de
intérieure trace de pile d'exception --- à
Système.Net.HttpWebRequest.GetResponse()
Merci d'avance.
OriginalL'auteur spitfyr86 | 2013-10-28
Vous devez vous connecter pour publier un commentaire.
Je veux juste partager que ce problème a déjà été résolu.
J'ai juste modifié la partie du code où j'ai mis le protocole de sécurité avant l'émission de la requête web.
À partir de:
:
Comme il s'est avéré, vCenter 5.5 utilise TLS comme son protocole SSL dans sa configuration. J'espère que les gens peuvent trouver cela utile lorsqu'ils sont confrontés à ce même problème.
OriginalL'auteur spitfyr86
Nous avons couru dans la même exception. Dans notre cas, la réponse a été incroyablement similaire à @Dennis Laping de réponse. Une autre équipe a eu de configurer le service que nous avons essayé de frapper à l'intérieur d'un Propriétaire de ranch d'équilibrage de la charge, qui par défaut ne permettent pas de TLS 1.0 ou SSL3. Il arrive que le courant de défaut pour SecurityProtocol (sans réglage).NET permet seulement TLS 1.0 ou SSL3.
Dès que nous avons mis le SecurityProtocol comme suit, tout a bien fonctionné:
Tout cela étant dit, la documentation de SecurityProtocol stipule que:
Nous allons réévaluer ce que la meilleure solution est de notre protocole de situation, mais pour l'instant, j'espère que cela aide quelqu'un d'autre.
cela a fonctionné pour moi!
OriginalL'auteur neumann1990
Voir ce lien, il a travaillé pour moi:
Comment faire HTTPS avec TcpClient comme HttpWebRequest?
P. S.
J'ai inséré cette ligne de code avant juste pour être sûr que le certificat côté serveur est acceptée:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
OriginalL'auteur MaGnumX