70 votes

HttpClient demande throws IOException

Le code suivant renvoie une IOException avec le message: "La clé de registre spécifiée n'existe pas."

HttpClient client = new HttpClient();

Uri uri = new Uri("http://www.google.com");

client.GetAsync(uri);

C'est juste dans une application console en Main. Il ressemble à l'erreur est levée par mscorlib.dll!Microsoft.Win32.RegistryKey.Win32Error(int errorCode, string str). Je n'ai aucune idée de pourquoi cette erreur est d'être jetés ou la façon de démarrer le débogage.

Modifier la trace de la pile:

chez Microsoft.Win32.RegistryKey.Win32Error(Int32 errorCode, String str)

C'est juste 1 ligne et il n'est nul exxception etc..

La pile d'appel est:

mscorlib.dll!Microsoft.Win32.RegistryKey.Win32Error(int errorCode, string str) + 0x189 bytes    
mscorlib.dll!Microsoft.Win32.RegistryKey.GetValueKind(string name) + 0x7f bytes 
System.dll!System.Net.HybridWebProxyFinder.InitializeFallbackSettings() + 0x9e bytes    
[Native to Managed Transition]  
[Managed to Native Transition]  
System.dll!System.Net.AutoWebProxyScriptEngine.AutoWebProxyScriptEngine(System.Net.WebProxy proxy, bool useRegistry) + 0xd0 bytes   
System.dll!System.Net.WebProxy.UnsafeUpdateFromRegistry() + 0x2c bytes  
System.dll!System.Net.Configuration.DefaultProxySectionInternal.DefaultProxySectionInternal(System.Net.Configuration.DefaultProxySection section) + 0x1d8 bytes 
System.dll!System.Net.Configuration.DefaultProxySectionInternal.GetSection() + 0xec bytes   
System.dll!System.Net.WebRequest.InternalDefaultWebProxy.get() + 0xcc bytes 
System.dll!System.Net.HttpWebRequest.HttpWebRequest(System.Uri uri, System.Net.ServicePoint servicePoint) + 0xdf bytes  
System.dll!System.Net.HttpWebRequest.HttpWebRequest(System.Uri uri, bool returnResponseOnFailureStatusCode, string connectionGroupName, System.Action<System.IO.Stream> resendRequestContent) + 0x2b bytes  
System.Net.Http.dll!System.Net.Http.HttpClientHandler.CreateAndPrepareWebRequest(System.Net.Http.HttpRequestMessage request) + 0x59 bytes   
System.Net.Http.dll!System.Net.Http.HttpClientHandler.SendAsync(System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) + 0xf4 bytes  
System.Net.Http.dll!System.Net.Http.HttpMessageInvoker.SendAsync(System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) + 0x4f bytes 
System.Net.Http.dll!System.Net.Http.HttpClient.SendAsync(System.Net.Http.HttpRequestMessage request, System.Net.Http.HttpCompletionOption completionOption, System.Threading.CancellationToken cancellationToken) + 0x13e bytes 
System.Net.Http.dll!System.Net.Http.HttpClient.GetAsync(System.Uri requestUri, System.Net.Http.HttpCompletionOption completionOption) + 0xc bytes   

ConsoleServiceTest.exe!ConsoleServiceTest.Program.Main(string[] args) Line 20 + 0x17 bytes  C#
    [Native to Managed Transition]  
    [Managed to Native Transition]  
    Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() + 0x5a bytes  
    mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) + 0x285 bytes 
    mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) + 0x9 bytes   
    mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x57 bytes    
    mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x51 bytes   
    [Native to Managed Transition]  

84voto

ligaz Points 1683

Il semble que cela est causé par une récente mise à jour de sécurité pour le .NET Framework: MS12-074: des Vulnérabilités dans .NET Framework pourrait permettre l'exécution de code à distance: novembre 13, 2012 (KO 2745030)

Tout se résume à la le code suivant dans le proxy web de la résolution:

[RegistryPermission(SecurityAction.Assert, Read=@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework")]
private static void InitializeFallbackSettings()
{
    allowFallback = false;
    try
    {
        using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\.NETFramework"))
        {
            try
            {
                if (key.GetValueKind("LegacyWPADSupport") == RegistryValueKind.DWord)
                {
                    allowFallback = ((int) key.GetValue("LegacyWPADSupport")) == 1;
                }
            }
            catch (UnauthorizedAccessException)
            {
            }
            catch (IOException)
            {
            }
        }
    }
    catch (SecurityException)
    {
    }
    catch (ObjectDisposedException)
    {
    }
}

Comme vous pouvez le voir, il vérifie la clé de registre spécifique mentionné dans l'article base de connaissances. Vous devriez noter que l'exception est interceptée à l'interne, mais vous voir parce que vous avez activé les Exceptions de Première Chance dans les options de débogage de Visual Studio.

Si vous ne voulez pas le voir de cette exception, vous devez ajouter la clé de registre spécifié avec la valeur 0:

Registry location: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework  
DWORD (32-bit) Value name: LegacyWPADSupport
Value data: 0

et pour les machines 64 bits:

Registry location: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework
DWORD (32-bit) Value name: LegacyWPADSupport
Value data: 0

28voto

Bill Menees Points 391

Je suis d'accord avec Ligaz réponse, et je me suis connecté une question de connexion sur ce bug: https://connect.microsoft.com/VisualStudio/feedback/details/773666/webrequest-create-eats-an-ioexception-on-the-first-call#details

Enregistrer les données suivantes dans un .reg fichier et l'importer dans la base de registre pour éviter cette erreur d'être soulevées:

Windows Registry Editor Version 5.00

; The following value prevents an IOException from being thrown and caught
; by System.Net.HybridWebProxyFinder.InitializeFallbackSettings() (in System.dll)
; when WebRequest.Create is first called.  By default the "LegacyWPADSupport"
; value doesn't exist, and when InitializeFallbackSettings calls GetValueKind,
; an IOException is thrown.  This adds the value with its default of false to
; prevent the exception.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"LegacyWPADSupport"=dword:00000000

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework]
"LegacyWPADSupport"=dword:00000000

10voto

user7116 Points 39829

Quelle que soit la raison, votre HttpClient code est à la recherche pour les paramètres de proxy dans le registre et impossible d'ouvrir la clé. Un coup d'oeil dans le code montre qu'il tente d'ouvrir HKCU puis passez à l'une des touches suivantes dans l'ordre:

  1. "HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections"
  2. "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections"
  3. "HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"

L'un de ces trois pourrait être la clé de votre processus n'a pas accès à l', pourquoi je ne suis pas sûr. Une solution possible consiste à désactiver Détecter Automatiquement les Paramètres de Proxy.

Sinon, vous aurez besoin de comprendre exactement ce qui touche, de chargement et nous allons le faire en deux étapes.

  1. Activer System.Net la journalisation.
  2. Téléchargez et exécutez Procmon, le filtrage sur le registre d'accès pour votre application, comme suit:
  1. Une fois ouvert, désactiver la capture si l'option est activée (la loupe doit avoir un X rouge).enter image description here
  2. Commencer à filtrer sur votre processus de nom.enter image description here
  3. Désélectionner toutes les options à l'exception des Entrées de Registre

enter image description here

  1. Permettre la capture (cliquez sur la loupe)
  2. Exécutez votre application
  3. Trouver le fautif entrée dans le journal, double-cliquez pour voir sur quelle touche il était d'ouverture

Une fois que vous déterminer les principales infractions, vous pouvez travailler à comprendre pourquoi votre candidature n'a pas accès à elle. Peut-être, si le nom de votre application est une indication, le compte d'utilisateur de votre service est en cours d'exécution en vertu n'a pas accès à la clé de registre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X