C#自动检测代理设置
C#2008 SP1 我正在使用代码检测是否在“Internet选项”下设置了代理。如果有代理,那么我将在我的webclient中设置它 所以我只是检查代理的地址是否存在。如果没有,则webclient中没有要设置的代理 这样做是否正确: 非常感谢你的建议C#自动检测代理设置,c#,networking,proxy,C#,Networking,Proxy,C#2008 SP1 我正在使用代码检测是否在“Internet选项”下设置了代理。如果有代理,那么我将在我的webclient中设置它 所以我只是检查代理的地址是否存在。如果没有,则webclient中没有要设置的代理 这样做是否正确: 非常感谢你的建议 WebProxy proxy = WebProxy.GetDefaultProxy(); if (proxy.Address.ToString() != string.Empty) { Console.WriteLine("Prox
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;
}
查看System.Net.Configuration.ProxyElement类。那可能有你要找的信息 你所描述的工作,你也可以看看注册表 下面是我为签出代理而编写的powershell脚本:
function get-proxy
{
$path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
$reg = get-itemproperty $path
return $reg
}
首先,它被标记为已弃用,因此您无法保证它在不久的将来仍然存在。第二,可以为null,因此您提供的代码有可能出现null引用异常:
WebClient
等使用WinHTTP设置(而不是IE设置),因此最简单的方法是配置WinHTTP!在XP等设备上,您可以使用:
proxycfg -u
将当前IE设置导入WinHTTP存储。之后,WebClient
etc应该能够使用相同的设置而不会出现问题。在Vista和Windows 7上,现在可以在以下位置找到:
netsh winhttp import proxy ie
您需要以管理员身份运行此操作。这似乎是WebProxy.GetDefaultProxy的最新版本
只需稍加修改,您就可以将其添加到原始代码中。比如:
WebProxy proxy = (WebProxy) WebRequest.DefaultWebProxy;
if (proxy.Address.AbsoluteUri != string.Empty)
{
Console.WriteLine("Proxy URL: " + proxy.Address.AbsoluteUri);
wc.Proxy = proxy;
}
请尝试以下操作:
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服务之前获得默认代理设置和凭据。将我的请求代理设置为
WebRequest。GetSystemWebProxy()
解决了此问题
WebProxy.GetDefaultProxy()
是实际使用的方法,但现在已被弃用。
<system.net>
<defaultProxy enabled="false" useDefaultCredentials="false">
<proxy/>
<bypasslist/>
<module/>
</defaultProxy>
在application.config文件中使用此代码段。这对我很有用
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
我已经使用p/invoke编辑了我的代码。如果计算是通过代理连接的,那么告诉我这个方法很有效。但是,引用我最初的代码帖子。这是获取代理信息的正确方法吗。i、 地址,港口?谢谢。我仍然认为配置WinHTTP比自己查询要好。在工作中,所有(非本地)流量都通过代理,如果我先配置了WinHTTP,那么我在使用
WebClient
时从来没有遇到过问题。此解决方案的问题是,用户需要运行命令更改系统范围的设置,才能使用您的应用程序。在受限环境下,他们也可能无法访问该命令和/或您的应用程序可能无法访问该命令。我不相信您的第一句话是正确的。这取决于应用程序的配置。有关更多信息,请参阅。我必须检查,但这是我在使用标准(空)应用程序配置的香草桌面上反复看到的行为。不过,我可能记错了。这是推荐的方法,它使您不必编写大量其他代码。我发现这给了我一个类强制转换异常,因为WebRequest.DefaultWebProxy正在返回WebProxyWrapper。不幸的是,在我的例子中,WebProxyWrapper不允许我访问底层WebProxy对象,这令人沮丧,因为我试图调试的代码似乎没有在实时环境中应用代理,而是在开发环境中应用代理。我也有同样的问题。我设法获得web代理的URI,而不是使用:URI uriProxy=WebRequest.DefaultWebProxy.GetProxy(新URI(“http://someserver.com”);你提供的演员阵容实际上抛出了一个InvalidCastException!无法将“WebProxyWrapper”类型的对象强制转换为“System.Net.WebProxy”类型。invalidcastexception+1。这对我有用。已启用跟踪以识别故障(无法检索uri的代理设置)。然后,默认代理(由域策略设置为无效uri)被使用,并立即失败。我使用了上述设置和吊杆。已修复。我认为没有提到在该注册表项路径中,感兴趣的字段/项是“ProxyEnable”和“ProxyServer”