2012-01-10 170 views
5

我在德國某公司遇到問題。他們在他們的網絡中使用代理,我的程序無法與服務器通信。C#從Internet Explorer獲取代理設置

IE工程與此設置:

Their settings

這意味着: 自動檢測設置

這是代碼:

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; 
    } 

} 

我的程序它記錄爲:

[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. 

如果他們寫入用戶並傳入proxy.ini文件,程序將工作。但問題是他們不能這樣做。不知何故IE沒有它。有沒有辦法從IE或系統獲取這些設置?

+0

首先,在catch(Exception e)中去掉e.message並且只是登錄e。這樣你得到一個堆棧跟蹤,你可以找出什麼對象是空的。 – mattypiper 2012-01-10 18:09:56

+0

ttymatty:它仍然不是完整的代碼,但問題早於'對象引用未設置爲對象實例'。查看'遠程服務器在嘗試Response =(HttpWebResponse)請求時返回了錯誤:(407)'。的GetResponse();'。響應爲空,因爲它沒有授權。 – Kaminari 2012-01-10 18:50:13

回答

13

使用GetSystemWebProxy返回系統默認代理服務器的內容。

WebRequest.DefaultProxy = WebRequest.GetSystemWebProxy(); 

但是每個HttpWebRequest默認情況下都會自動填充此信息。例如,獨立控制檯應用程序中的以下片段應該在配置了PAC文件的系統上打印正確的信息。

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

是不是這樣:'request.Proxy = WebRequest.DefaultWebProxy;'? – Kaminari 2012-01-10 18:47:50

+0

是的你是對的。如果你執行我發佈的代碼,系統是否有代理?在Internet選項中選擇「自動配置」很難說。 – mattypiper 2012-01-11 17:30:12

+0

這不起作用。還有哪些地方會成爲問題?在請求標頭中? – Kaminari 2012-01-11 18:20:18

相關問題