2011-02-04 59 views
6

Internet Explorerで定義されたWebプロキシがあるときにうまく動作するコードがあります。ただし、定義されていない場合は機能しません。プロキシが定義されているかどうか確認したいこれを行うには、以下のコードをどのように変更しますか?プロキシサーバーが設定されているかどうかを確認する方法は?

public DataTable GetCurrentFxPrices(string url) 
{ 
    WebProxy wp = new WebProxy(WebProxy.GetDefaultProxy().Address.AbsoluteUri, true); 
    wp.Credentials = CredentialCache.DefaultCredentials; 

    WebClient wc = new WebClient(); 
    wc.Proxy = wp; 

    MemoryStream ms = new MemoryStream(wc.DownloadData(url)); 
    DataSet ds = new DataSet("fxPrices"); 
    ds.ReadXml(ms); 

    DataTable dt = ds.Tables["Rate"]; 
    int i = dt.Rows.Count; 
    return dt; 
} 

たとえば、プロキシを使用せずにデータをダウンロードするにはどうすればよいですか?

UPDATE

私は、if文の行に次のエラーSystem.NullReferenceException was unhandled by user codeを取得するには、次の

public DataTable GetCurrentFxPrices(string url) 
{ 
    WebClient wc = new WebClient(); 

    if (!String.IsNullOrEmpty(WebProxy.GetDefaultProxy().Address.AbsoluteUri)) 
    { 
     WebProxy wp = new WebProxy(WebProxy.GetDefaultProxy().Address.AbsoluteUri, true); 
     wp.Credentials = CredentialCache.DefaultCredentials; 
     wc.Proxy = wp; 
    }    

    MemoryStream ms = new MemoryStream(wc.DownloadData(url)); 
    DataSet ds = new DataSet("fxPrices"); 
    ds.ReadXml(ms); 
    DataTable dt = ds.Tables["Rate"]; 

    int i = dt.Rows.Count; 
    return dt; 
} 

にコードを変更しました。

UPDATE 2

私も、この行を変更しようとしました:

if (!String.IsNullOrEmpty(WebProxy.GetDefaultProxy().Address.AbsoluteUri))

if (WebProxy.GetDefaultProxy().Address.AbsoluteUri != null)

に私はこのエラーを取得:

System.NullReferenceException: Object reference not set to an instance of an object.

+0

プロキシなし: 'wc.Proxy = wp;'を省略すると、そのトリックを行いますか? ( "プロキシがない場合は設定しないでください") – Piskvor

+2

WebProxy.GetDefaultProxy()は廃止されましたか? WebRequest.GetSystemWebProxy()またはWebRequest.DefaultWebProxyを代わりに使用する必要があります。 –

+0

私は 'GetSystemWebProxy'を使うように質問を更新しました。まだ問題がある、あなたは見てみることができますか? –

答えて

10

あなたが考えるかもしれない1つの「プロキシアドレス」またはプロキシUriはありません。代わりに、プロキシUriは、Internet Explorerの[プロキシ設定]ダイアログに表示されるように、取得する各Uriに依存する場合があります。

Internet Explorer - Proxy Settings dialog

IWebProxyインタフェースは、右のプロキシURIを取得するのに役立ちますし、このプロキシを使用するか、検索される特定のURIのためにバイパスされる場合を示しています。

​​

あなたの方法では、プロキシアドレスではなくIWebProxyインターフェイスを渡す必要があります。既定のプロキシインターフェイス(GetSystemWebProxyなど)は常に既定値として設定されます。

あなたのUriにプロキシが使用されていない場合に備えて独自の特別なプロキシを設定したい場合は、次の操作を行うことができます。

public DataTable GetCurrentFxPrices(string url) 
{ 
    Uri uri = new Uri(url); 

    WebClient webClient = new WebClient(); 
    IWebProxy defaultProxy = WebRequest.GetSystemWebProxy(); 

    IWebProxy myProxy = new WebProxy(new Uri("http://myproxy:8080")) 
    // if no bypass-list is specified, all Uris are to be retrieved via proxy 

    if (defaultProxy.IsBypassed(uri)) 
    { 
     myProxy.Credentials = CredentialCache.DefaultCredentials; 
     webClient.Proxy = myProxy; 
    }    

    MemoryStream ms = new MemoryStream(webClient.DownloadData(url)); 
    DataSet ds = new DataSet("fxPrices"); 
    ds.ReadXml(ms); 
    DataTable dt = ds.Tables["Rate"]; 

    int i = dt.Rows.Count; 
    return dt; 
} 
+0

注: 'IWebProxy.IsBypassed()'と 'IWebProxy.GetProxy()'の両方を呼び出すべきではありません。 (特に 'WebRequest.GetSystemWebProxy()'の場合)[長いURLのためにコメント分割] – antak

+0

'GetProxy()'の呼び出しが必要な場合は、プロキシをバイパスするかどうかを安全に判断する方法(Uriと元のUriが同じかどうかを調べるために結果のUriを比較する)(https://referencesource.microsoft.com/#system/net/System/Net/webproxy.cs,598)と思われる。 (例: 'isBypassed =(webProxy.GetProxy(uri)== uri'))これは[これはまったく文書化されていません](https://msdn.microsoft.com/en-us/library/system.net.iwebproxy .getproxy(v = vs.110).aspx)。 – antak

+1

@antakそうです。プロキシの設定は、通常は毎回変わらず、特に各msecではないので、説明されている問題は私にとっては少しアカデミックなものです。 ;)したがって、最も一般的なケースでは、大丈夫です。 – oleschri

0

ちょうどあなたがデバッガを使用し、if文にブレークポイントを置くことができる

if(!String.IsNullOrEmpty(WebProxy.GetDefaultProxy().Address.AbsoluteUri)) 
{ 
    //do something you want if proxy is set 
} 
else 
{ 
    //something else(proxy not set) 
} 
+0

ええ、私はそれをやっていると思ったが、どのように私はプロキシなしでWebClientを設定するか分からない。そこに任意のアイデア? –

0

を呼びますか?

私が正しい場合、WebProxy.GetDefaultProxy()コールはnullを返し、したがってNullReferenceExceptionを返します。あなたは、コードを変更するとどうなりますか

if ((WebProxy.GetDefaultProxy() != null) && (!String.IsNullOrEmpty(WebProxy.GetDefaultProxy().Address.AbsoluteUri))) 

は、私はそれはあなたの問題を解決すべきだと思います。

+0

私は、WebProxy.GetDefaultProxy()は、V1から時代遅れとマークされているので、使用しないようにしようとしています。私は 'IWebProxy iwp = WebRequest.GetSystemWebProxy()'のようなものを使いたいです。それを使用してプロキシの存在をテストする方法に関するアイデアはありますか? –

+0

プロキシが設定されていない状態で呼び出すようにしてください。 iwpがnullになるか、例外がスローされます。 – JochemKempe

+0

私の前提が正しくない、iwpがヌルでもなく、例外もスローされません。 しかし、iwp.IsBypassed(Uri uri)をあなたの目標uriについてチェックすることは可能ですか? – JochemKempe

関連する問題