WebClient 和多个网络适配器
WebClient and multiple network adaptors
我正在使用 WebClient 尝试从本地连接到我的 PC 的硬件获取字符串响应。我的 PC 有一个连接到 LAN 的网络适配器和另一个仅连接到我的硬件的适配器。
如果我将 IE 与 URL 一起使用: http://169.254.103.127/set.cmd?user=admin+pass=12345678+cmd=getpower 我会返回一个字符串作为响应。我正在尝试使用以下代码片段来实现相同的目的:
using (WebClient client = new WebClient())
{
client.Proxy = WebRequest.DefaultWebProxy;
client.Credentials = CredentialCache.DefaultCredentials;
client.Proxy.Credentials = CredentialCache.DefaultCredentials;
client.Headers["User-Agent"] =
"Mozilla/4.0 (Compatible; Windows NT 5.1; MSIE 6.0) " +
"(compatible; MSIE 6.0; Windows NT 5.1; " +
".NET CLR 1.1.4322; .NET CLR 2.0.50727)";
String test = client.DownloadString(@"http://169.254.103.127/set.cmd?user=admin+pass=12345678+cmd=getpower");
}
如果我禁用连接到我的 LAN 的网络适配器,则此代码段有效,但否则会超时。
谁能解释为什么会这样以及我需要做什么才能将请求路由到正确的网络?
您的问题取决于您的网络适配器使用的默认指标。
简答
进入您的本地适配器设置(连接到您的设备的那个)-> 属性-> IP v4 属性-> 高级-> 取消选中自动指标-> 输入默认值,例如 900。
解释
指标是您的 OS 用于为特定目的地选择最佳方式的指标(通常是当您有超过 1 条路线可用于同一目的地时)
您的 LAN 适配器可能有一个默认网关,其指标由您的 OS 自动定义。
由于此网关是手动或由 DHCP 定义的,因此默认情况下,Windows 将在此适配器上使用比其他具有自动 link-local address.
的适配器更好的指标
这意味着你的OS会优先选择默认网关(局域网)去169.254.103.127而不是你的本地网卡
您可以使用此命令来检查您的路线和指标:
route print
例如我的电脑默认配置:
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.100 276 // Default gateway
127.0.0.0 255.0.0.0 On-link 127.0.0.1 306
127.0.0.1 255.255.255.255 On-link 127.0.0.1 306
127.255.255.255 255.255.255.255 On-link 127.0.0.1 306
169.254.0.0 255.255.0.0 On-link 169.254.239.60 261 // Where you want to go
169.254.239.60 255.255.255.255 On-link 169.254.239.60 261
169.254.255.255 255.255.255.255 On-link 169.254.239.60 261
192.168.1.0 255.255.255.0 On-link 192.168.1.100 276
192.168.1.100 255.255.255.255 On-link 192.168.1.100 276
192.168.1.255 255.255.255.255 On-link 192.168.1.100 276
由于 276 > 261,ping 169.254.103.127 将使用 lan 192.168.1.100 而不是 169.254.239.60
将代理设置为空解决了我的问题,这是完成的功能:
private String SendCommand(String command)
{
String response = null;
using (WebClient client = new WebClient())
{
client.Proxy = null;
response = client.DownloadString(command);
}
return response;
}
我正在使用 WebClient 尝试从本地连接到我的 PC 的硬件获取字符串响应。我的 PC 有一个连接到 LAN 的网络适配器和另一个仅连接到我的硬件的适配器。
如果我将 IE 与 URL 一起使用: http://169.254.103.127/set.cmd?user=admin+pass=12345678+cmd=getpower 我会返回一个字符串作为响应。我正在尝试使用以下代码片段来实现相同的目的:
using (WebClient client = new WebClient())
{
client.Proxy = WebRequest.DefaultWebProxy;
client.Credentials = CredentialCache.DefaultCredentials;
client.Proxy.Credentials = CredentialCache.DefaultCredentials;
client.Headers["User-Agent"] =
"Mozilla/4.0 (Compatible; Windows NT 5.1; MSIE 6.0) " +
"(compatible; MSIE 6.0; Windows NT 5.1; " +
".NET CLR 1.1.4322; .NET CLR 2.0.50727)";
String test = client.DownloadString(@"http://169.254.103.127/set.cmd?user=admin+pass=12345678+cmd=getpower");
}
如果我禁用连接到我的 LAN 的网络适配器,则此代码段有效,但否则会超时。
谁能解释为什么会这样以及我需要做什么才能将请求路由到正确的网络?
您的问题取决于您的网络适配器使用的默认指标。
简答
进入您的本地适配器设置(连接到您的设备的那个)-> 属性-> IP v4 属性-> 高级-> 取消选中自动指标-> 输入默认值,例如 900。
解释
指标是您的 OS 用于为特定目的地选择最佳方式的指标(通常是当您有超过 1 条路线可用于同一目的地时)
您的 LAN 适配器可能有一个默认网关,其指标由您的 OS 自动定义。 由于此网关是手动或由 DHCP 定义的,因此默认情况下,Windows 将在此适配器上使用比其他具有自动 link-local address.
的适配器更好的指标这意味着你的OS会优先选择默认网关(局域网)去169.254.103.127而不是你的本地网卡
您可以使用此命令来检查您的路线和指标:
route print
例如我的电脑默认配置:
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.100 276 // Default gateway
127.0.0.0 255.0.0.0 On-link 127.0.0.1 306
127.0.0.1 255.255.255.255 On-link 127.0.0.1 306
127.255.255.255 255.255.255.255 On-link 127.0.0.1 306
169.254.0.0 255.255.0.0 On-link 169.254.239.60 261 // Where you want to go
169.254.239.60 255.255.255.255 On-link 169.254.239.60 261
169.254.255.255 255.255.255.255 On-link 169.254.239.60 261
192.168.1.0 255.255.255.0 On-link 192.168.1.100 276
192.168.1.100 255.255.255.255 On-link 192.168.1.100 276
192.168.1.255 255.255.255.255 On-link 192.168.1.100 276
由于 276 > 261,ping 169.254.103.127 将使用 lan 192.168.1.100 而不是 169.254.239.60
将代理设置为空解决了我的问题,这是完成的功能:
private String SendCommand(String command)
{
String response = null;
using (WebClient client = new WebClient())
{
client.Proxy = null;
response = client.DownloadString(command);
}
return response;
}