2012-01-10 21 views
5

Tengo un problema en cierta compañía en Alemania. Usan proxy en su red y mi programa no puede comunicarse con el servidor.C# Obtener la configuración de proxy de Internet Explorer

IE trabaja con esta configuración:

Their settings

Significa: Detectar la configuración automáticamente

Este es el código:

public static bool CompleteValidation(string regKey) 
{ 
    string uri = "***"; 

    int c = 1; 
    if (Counter < 5) c = 6 - Counter; 
    string response = ""; 
    try 
    { 
     System.Net.ServicePointManager.Expect100Continue = false; 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); 
     request.AllowWriteStreamBuffering = true; 
     request.Method = "POST"; 
     request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0"; 
     request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
     request.Headers.Add(HttpRequestHeader.AcceptLanguage, "pl,en-us;q=0.7,en;q=0.3"); 
     request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate"); 
     request.Headers.Add(HttpRequestHeader.AcceptCharset, "ISO-8859-2,utf-8;q=0.7,*;q=0.7"); 
     request.KeepAlive = true; 

     //proxy settings 
     string exepath = Path.GetDirectoryName(Application.ExecutablePath); 
     string proxySettings = exepath + @"\proxy.ini"; 
     WebProxy wp = new WebProxy(); 
     if (File.Exists(proxySettings)) { 
      request.Proxy = WebRequest.DefaultWebProxy; 
      IniFile ini = new IniFile(proxySettings); 
      string user = ini.IniReadValue("Proxy", "User"); 
      string pass = ini.IniReadValue("Proxy", "Password"); 
      string domain = ini.IniReadValue("Proxy", "Domain"); 
      string ip = ini.IniReadValue("Proxy", "IP"); 
      string port_s = ini.IniReadValue("Proxy", "Port"); 
      int port = 0; 
      if (!string.IsNullOrEmpty(ip)) 
      { 
       if (!string.IsNullOrEmpty(port_s)) 
       { 
        try 
        { 
         port = Convert.ToInt32(port_s); 
        } 
        catch (Exception e) 
        { 
         ErrorLog.AddToLog("Problem with conversion of port:"); 
         ErrorLog.AddToLog(e.Message); 
         ErrorLog.ShowLogWindow(); 
        } 
        wp = new WebProxy(ip, port); 
       } else { 
        wp = new WebProxy(ip); 
       } 

      } 
      if (string.IsNullOrEmpty(domain)) 
       wp.Credentials = new NetworkCredential(user, pass); 
      else 
       wp.Credentials = new NetworkCredential(user, pass, domain); 
      request.Proxy = wp; 
     } 

     string post = "***"; 
     request.ContentLength = post.Length; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     StreamWriter writer = null; 
     try 
     { 
      writer = new StreamWriter(request.GetRequestStream()); // Here is the WebException thrown 
      writer.Write(post); 
      writer.Close(); 
     } 
     catch (Exception e) 
     { 
      ErrorLog.AddToLog("Problem with request sending:"); 
      ErrorLog.AddToLog(e.Message); 
      ErrorLog.ShowLogWindow(); 
     } 
     HttpWebResponse Response = null; 
     try 
     { 
      Response = (HttpWebResponse)request.GetResponse(); 
     } 
     catch (Exception e) 
     { 
      ErrorLog.AddToLog("Problem with response:"); 
      ErrorLog.AddToLog(e.Message); 
      ErrorLog.ShowLogWindow(); 
     } 

     //Request.Proxy = WebProxy.GetDefaultProxy(); 
     //Request.Proxy.Credentials = CredentialCache.DefaultCredentials; 
     string sResponseHeader = Response.ContentEncoding; // get response header 

     if (!string.IsNullOrEmpty(sResponseHeader)) 
     { 
      if (sResponseHeader.ToLower().Contains("gzip")) 
      { 
       byte[] b = DecompressGzip(Response.GetResponseStream()); 
       response = System.Text.Encoding.GetEncoding(Response.ContentEncoding).GetString(b); 
      } 
      else if (sResponseHeader.ToLower().Contains("deflate")) 
      { 
       byte[] b = DecompressDeflate(Response.GetResponseStream()); 
       response = System.Text.Encoding.GetEncoding(Response.ContentEncoding).GetString(b); 
      } 
     } 
     // uncompressed, standard response 
     else 
     { 
      StreamReader ResponseReader = new StreamReader(Response.GetResponseStream()); 
      response = ResponseReader.ReadToEnd(); 
      ResponseReader.Close(); 
     } 
    } 
    catch (Exception e) 
    { 
     ErrorLog.AddToLog("Problem with comunication:"); 
     ErrorLog.AddToLog(e.Message); 
     ErrorLog.ShowLogWindow(); 
    } 

    if (response == "***") 
    { 
     SaveKeyFiles(); 
     WriteRegKey(regKey); 
     RenewCounter(); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 

} 

mi programa de registros como:

[09:13:18] Searching for hardware ID 
[09:13:56] Problem with response: 
[09:13:56] The remote server returned an error: (407) Proxy Authentication Required. 
[09:15:04] problem with comunication: 
[09:15:04] Object reference not set to an object instance. 

Si escriben al usuario y pasan al archivo proxy.ini, el programa funciona. Pero el problema es que no pueden hacer eso. Y de alguna manera IE funciona sin eso. ¿Hay alguna forma de obtener esas configuraciones desde IE o el sistema?

+0

En primer lugar, en la captura (Excepción e) deshacerse de e.message y simplemente iniciar sesión e. De esta forma obtienes un seguimiento de pila y puedes averiguar qué objeto es nulo. – mattypiper

+0

ttymatty: su código aún no es completo, pero el problema es anterior a 'Referencia de objeto no establecida en una instancia de objeto. 'Observa' El servidor remoto devolvió un error: (407) 'al intentar responder a' Response = (HttpWebResponse). GetResponse(); '. La respuesta es nula porque no fue autorizada. – Kaminari

Respuesta

13

Utilice GetSystemWebProxy para devolver el proxy predeterminado del sistema.

WebRequest.DefaultProxy = WebRequest.GetSystemWebProxy(); 

Pero cada HttpWebRequest automáticamente deberá ser llenado con esta información por defecto. Por ejemplo, el siguiente fragmento en una aplicación de consola independiente debe imprimir la información correcta en un sistema con un archivo PAC configurado.

HttpWebRequest myWebRequest=(HttpWebRequest)WebRequest.Create("http://www.microsoft.com"); 

    // Obtain the 'Proxy' of the Default browser. 
    IWebProxy proxy = myWebRequest.Proxy; 
    // Print the Proxy Url to the console. 
    if (proxy != null) 
    { 
     Console.WriteLine("Proxy: {0}", proxy.GetProxy(myWebRequest.RequestUri)); 
    } 
    else 
    { 
     Console.WriteLine("Proxy is null; no proxy will be used"); 
    } 
+0

¿No es lo mismo que: 'request.Proxy = WebRequest.DefaultWebProxy;'? – Kaminari

+0

Sí, tienes razón. Si ejecuta el código que publiqué, ¿el sistema tiene un proxy o no? Es difícil de decir con la "configuración automática" seleccionada en Opciones de Internet. – mattypiper

+0

No funciona. ¿Dónde más puede ser un problema? En encabezados de solicitud? – Kaminari

7

Uso DefaultNetworkCredentials para volver credenciales de proxy del sistema.

request.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; 
Cuestiones relacionadas