WebProxy与&之间的关系是什么?关于WebClient的IWebProxy?

时间:2010-05-21 23:42:02

标签: c# .net webclient webproxy

我正在创建一个应用程序(.NET 2.0),它使用WebClient连接(下载数据等)到/从http Web服务。 我现在正在添加一个表单来处理允许代理信息存储或设置为使用默认值。我对某些事情感到有些困惑。

首先,一些方法& WebProxy或IWebProxy中可用的属性不在两者中。在设置WebClient调用方式时,有什么区别?

其次,如果我在其他地方使用WebProxy或IWebProxy类设置它,我是否必须告诉WebClient使用代理信息?或者是自动继承?

第三,当为用户提供使用默认代理(IE中设置的任何内容)和使用默认凭证(我还假设在IE中设置的任何内容)的选项时,这两者是否相互排斥?或者,当您还使用默认代理时,您只使用默认凭据?

这让我了解了WebProxy和IWebProxy之间的全部区别。 WebRequest.DefaultProxy是一个IWebPRoxy类 但 UseDefaultCredentials不是IWebProxy类上的方法,而是仅在WebProxy上,反过来,如果它们是两个不同的类,如何将代理设置为WebRequest.DefautlProxy?

这是我当前用户读取存储的表单设置的方法 - 但由于WebProxy和IWebProxy的混合,我不确定这是否正确,不够,过度或错误:

    private WebProxy _proxyInfo = new WebProxy();
    private WebProxy SetProxyInfo()
    {
        if (UseProxy) 
        {
            if (UseIEProxy)
            {
                // is doing this enough to set this as default for WebClient?
                IWebProxy iProxy = WebRequest.DefaultWebProxy; 
                if (UseIEProxyCredentials)
                {
                    _proxyInfo.UseDefaultCredentials = true;
                }
                else
                {
                    // is doing this enough to set this as default credentials for WebClient?
                    WebRequest.DefaultWebProxy.Credentials = new NetworkCredential(ProxyUsername, ProxyPassword);
                }
            }
            else
            {
                // is doing this enough to set this as default for WebClient?
                WebRequest.DefaultWebProxy = new WebProxy(ProxyAddress, ParseLib.StringToInt(ProxyPort));
                if (UseIEProxyCredentials)
                {
                    _proxyInfo.UseDefaultCredentials = true;
                }
                else
                {
                    WebRequest.DefaultWebProxy.Credentials = new NetworkCredential(ProxyUsername, ProxyPassword);
                }
            }
        }
        // Do I need to WebClient to absorb this returned proxy info if I didn't set or use defaults?
        return _proxyInfo;
    }

是否有任何理由不仅仅废弃存储应用程序特定的代理信息,而且只允许应用程序使用默认代理信息&登录用户的凭据?如果使用HTTP,这还不够吗?

第2部分问题:
如何测试WebClient实例是否正在使用代理信息?

1 个答案:

答案 0 :(得分:1)

IWebProxy是一个接口,WebProxy实现了该接口。因此,WebProxy可以拥有更多IWebProxy上没有的方法/属性。

根据WebClient page on MSDN ...

  
    

说明

  
     

Proxy属性标识   通信的IWebProxy实例   用远程服务器代表这个   WebClient对象。代理设置为   系统使用配置文件   和Internet Explorer本地区域   网络设置。要指定否   应该使用代理,设置代理   属性到代理实例   由GetEmptyWebProxy返回   方法

     

有关自动代理的信息   检测,请参阅自动代理   检测

因此,如果您没有明确指定webproxy,则应该没问题。它应该使用IE正在使用的那个(如果有的话)。