web-dev-qa-db-ja.com

C#プロキシ設定を自動検出

C#2008 SP1

このコードを使用して、[インターネットオプション]でプロキシが設定されているかどうかを検出しています。プロキシがある場合は、これを自分のWebクライアントに設定します。

プロキシのアドレスが存在するかどうかを確認しています。ない場合は、webclientに設定するプロキシがありません。

これはこれを行う正しい方法ですか?

アドバイスありがとうございます。

WebProxy proxy = WebProxy.GetDefaultProxy();

if (proxy.Address.ToString() != string.Empty)
{
    Console.WriteLine("Proxy URL: " + proxy.Address.ToString());
    wc.Proxy = proxy;
}

======コード編集======

[DllImport("wininet.dll", CharSet = CharSet.Auto)]
private extern static bool InternetGetConnectedState(ref InternetConnectionState_e lpdwFlags, int dwReserved);

[Flags]
enum InternetConnectionState_e : int
{
    INTERNET_CONNECTION_MODEM = 0x1,
    INTERNET_CONNECTION_LAN = 0x2,
    INTERNET_CONNECTION_PROXY = 0x4,
    INTERNET_RAS_INSTALLED = 0x10,
    INTERNET_CONNECTION_OFFLINE = 0x20,
    INTERNET_CONNECTION_CONFIGURED = 0x40
}     

// Return true or false if connecting through a proxy server
public bool connectingThroughProxy()
{
    InternetConnectionState_e flags = 0;
    InternetGetConnectedState(ref flags, 0);
    bool hasProxy = false;

    if ((flags & InternetConnectionState_e.INTERNET_CONNECTION_PROXY) != 0)
    {
        hasProxy = true;
    }
    else
    {
        hasProxy = false;
    }

    return hasProxy;
}
23
ant2009

WebRequest.DefaultWebProxy は、WebProxy.GetDefaultProxyの 公式の置き換え のようです。

少し変更するだけで、それを元のコードにドロップできるはずです。何かのようなもの:

WebProxy proxy = (WebProxy) WebRequest.DefaultWebProxy;
if (proxy.Address.AbsoluteUri != string.Empty)
{
    Console.WriteLine("Proxy URL: " + proxy.Address.AbsoluteUri);
    wc.Proxy = proxy;
}
27

WebClient etcはWinHTTP設定を使用するため(IE設定ではありません)、WinHTTPを構成するのが最も簡単です!On XP etcあなたは使うことができます:

proxycfg -u

現在のIE設定をWinHTTPストアにインポートします。その後、WebClientなどが問題なく同じ設定を使用できるようになります。VistaおよびWindows 7ではこれが見つかります下:

netsh winhttp import proxy ie

これは管理者として実行する必要があります。

5
Marc Gravell

最初に、 GetDefaultProxy は非推奨としてマークされているため、当面の間であっても保証されません。次に、 Address はnullになる可能性があるため、指定したコードはNullReferenceExceptionの危険を冒します。

4

以下を試してください:

public string GetMeMyInfo(string searchCriteria)
{
    // Instatiate the web service and declare the necessary variables
    WsService.WsServiceBus oWsGetInfo = new WsService.WsServiceBus();
    // Configure the Web Service Proxy
    oWsGetInfo.Proxy = System.Net.WebProxy.GetDefaultProxy();
    oWsGetInfo.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
    // Invoke the web service
    return oWsGetInfo.GetInfo4Me(searchCriteria);
}

これにより、たとえばWebサービスを呼び出す前に、デフォルトのプロキシ設定と資格情報が取得されます。

3
EdsonF
<system.net>
<defaultProxy enabled="false" useDefaultCredentials="false">
  <proxy/>
  <bypasslist/>
  <module/>
</defaultProxy>

このスニペットをapplication.configファイルで使用します。

3
Manoj

これは私のために働く

        var proxy = WebRequest.GetSystemWebProxy();
        Uri testUrl = new Uri("http://proxy.example.com");
        var proxyUrl = proxy.GetProxy(testUrl);
        if (proxyUrl != testUrl)
            //Use your proxy here
        else
            //We are not using a proxy
3
SpeedOfSpin

リクエストプロキシをWebRequest.GetSystemWebProxy()に設定すると、問題が解決しました。

WebProxy.GetDefaultProxy()が実際の方法ですが、現在は非推奨です。

2
iCoder

System.Net.Configuration.ProxyElementクラスを確認してください。あなたが探している情報があるかもしれません。

あなたが説明することはうまくいきます、あなたはレジストリを調べることもできます。

プロキシをチェックアウトするために私が書いたPowerShellスクリプトは次のとおりです。

function get-proxy
{
    $path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
    $reg = get-itemproperty $path
    return $reg
}
2
John Weldon