C#从Internet Explorer获取代理设置

我在德国的某家公司遇到了问题。 他们在他们的网络中使用代理,我的程序无法与服务器通信。

IE使用此设置:

他们的设置

它表示:自动检测设置

这是代码:

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或系统获取这些设置?

使用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"); } 

使用DefaultNetworkCredentials返回系统代理凭据。

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