C# 自动检测代理设置
Posted
技术标签:
【中文标题】C# 自动检测代理设置【英文标题】:C# auto detect proxy settings 【发布时间】:2010-10-25 01:46:30 【问题描述】:C# 2008 SP1
我正在使用代码来检测是否在“Internet 选项”下设置了代理。如果有代理,那么我将在我的网络客户端中设置它。
所以我只是检查代理的地址是否存在。如果没有,则在 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;
【问题讨论】:
【参考方案1】:WebRequest.DefaultWebProxy 似乎是 WebProxy.GetDefaultProxy 的 official replacement。
您只需稍作修改即可将其放入原始代码中。比如:
WebProxy proxy = (WebProxy) WebRequest.DefaultWebProxy;
if (proxy.Address.AbsoluteUri != string.Empty)
Console.WriteLine("Proxy URL: " + proxy.Address.AbsoluteUri);
wc.Proxy = proxy;
【讨论】:
这是推荐的方法,它使您不必编写一堆其他代码。 我发现这给了我一个类转换异常,因为 WebRequest.DefaultWebProxy 正在返回一个 WebProxyWrapper。不幸的是,就我而言,WebProxyWrapper 让我无法访问底层 WebProxy 对象,这令人沮丧,因为我尝试调试的代码似乎不是在实时环境中应用代理,而是在开发环境中这样做。 我也有同样的问题。我设法使用以下方法获取 Web 代理的 URI:Uri uriProxy = WebRequest.DefaultWebProxy.GetProxy(new Uri("http://someserver.com")); 您提供的演员阵容实际上引发了 InvalidCastException!无法将“WebProxyWrapper”类型的对象转换为“System.Net.WebProxy”类型。 invalidcastexception【参考方案2】:首先,GetDefaultProxy 被标记为已弃用,因此您无法保证即使在不久的将来它也会出现。其次,Address 可以为 null,因此您提供的代码可能会出现 NullReferenceException:
【讨论】:
【参考方案3】:WebClient
等使用WinHTTP设置(不是IE设置),所以最简单的方法就是配置WinHTTP!在 XP 等您可以使用:
proxycfg -u
将当前的 IE 设置导入 WinHTTP 存储。之后,WebClient
等应该能够毫无问题地使用相同的设置。在 Vista 和 Windows 7 上,现在可以在以下位置找到:
netsh winhttp import proxy ie
您需要以管理员身份运行。
【讨论】:
我使用 p/invoke 编辑了我的代码。这很好地告诉我计算是否通过代理连接。但是,参考我的初始代码帖子。这是获取有关代理信息的正确方法吗?即地址,端口?谢谢。 好吧,我仍然认为配置 WinHTTP 比自己查询更好。在工作中,所有(非本地)流量都通过代理,如果我先配置了 WinHTTP,我从来没有遇到过使用WebClient
的问题。
这个解决方案的问题是它需要用户运行一个命令来改变系统范围的设置才能使用你的应用程序。在受限环境下,他们也可能无权访问该命令和/或您的应用程序可能无权访问它。
我不相信你的第一句话是正确的。这取决于应用程序的配置。请参阅msdn.microsoft.com/en-us/magazine/cc300743.aspx 了解更多信息。
@EricLaw 我必须检查一下,但这是我在标准(空)应用程序配置的香草桌面上反复看到的行为。不过我可能记错了。【参考方案4】:
<system.net>
<defaultProxy enabled="false" useDefaultCredentials="false">
<proxy/>
<bypasslist/>
<module/>
</defaultProxy>
在 application.config 文件中使用这个 sn-p。
【讨论】:
+1。这对我有用。启用跟踪以识别故障(无法检索 uri 的代理设置)。然后,使用默认代理(由域策略设置为无效 uri)并立即失败。我使用了上述设置和繁荣。固定。【参考方案5】:这对我有用
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
【讨论】:
【参考方案6】:尝试以下方法:
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);
例如,这将在调用您的网络服务之前获得默认代理设置和凭据。
【讨论】:
【参考方案7】:查看 System.Net.Configuration.ProxyElement 类。这可能包含您正在寻找的信息。
你所描述的作品,你也可以在注册表中查看。
这是我为检查代理而编写的一个 powershell 脚本:
function get-proxy
$path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
$reg = get-itemproperty $path
return $reg
【讨论】:
我认为没有提到在该注册表项路径中,感兴趣的字段/键是“ProxyEnable”和“ProxyServer”【参考方案8】:将我的请求代理设置为WebRequest.GetSystemWebProxy()
解决了这个问题。
WebProxy.GetDefaultProxy()
是实际的方式,但现在已弃用。
【讨论】:
以上是关于C# 自动检测代理设置的主要内容,如果未能解决你的问题,请参考以下文章
打开proxifier,出现 :“(自动 DNS 模式检测) 本地 DNS 服务可用。通过代理服务器的名称解析已禁用。 ”