2012-01-10 19 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を削除してログに記録します。この方法でスタックトレースを取得し、どのオブジェクトがnullであるかを知ることができます。 – mattypiper

+0

ttymatty:まだ完全なコードではありませんが、問題は 'オブジェクト参照がオブジェクトインスタンスに設定されていません。' '応答=(HttpWebResponse)リクエストをしようとすると、'リモートサーバーはエラー:(407) 'を返しました。 GetResponse(); '。承認されていないため、レスポンスはnullです。 – Kaminari

答えて

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

+0

はい、あなたは正しいです。投稿したコードを実行すると、システムにプロキシがあるかどうかインターネットオプションで選択されている「自動設定」では分かりにくいです。 – mattypiper

+0

これは機能しません。他にどこに問題がありますか?リクエストヘッダーでは? – Kaminari

7

システムプロキシ認証情報を返すには、DefaultNetworkCredentialsを使用します。

request.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; 
関連する問題