c# - WebProxy 和 IWebProxy 与 WebClient 之间的关系是什么?

标签 c# .net webclient webproxy

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

首先,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 实例是否使用代理信息?

最佳答案

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

根据WebClient page on MSDN ...

Remarks

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

有关自动代理的信息 检测,见自动代理 检测。

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

关于c# - WebProxy 和 IWebProxy 与 WebClient 之间的关系是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2886274/

相关文章:

c# - 在数据库中存储类名和程序集名有多糟糕?

c# - 默认构造函数在不需要时不必要地初始化依赖项

c# - 如何使用 Moq 对 Entity Framework 6 中的删除操作进行单元测试

c# - WebClient异常,不支持并发I/O操作

c# - 如何关闭 Ranorex 中的浏览器选项卡?

c# - 打开 BinaryReader 时使用 Stream.Seek 是否安全?

c# - 尝试在 .NET 中使用 EventLog.SourceExists 方法时出现问题

c# - 自定义编译器警告

.net - WebClient Headers 属性缺少 Add 方法?

c# - 使用 c# Webclient 通过 https 请求 html