WebClient和多个网络适配器

本文关键字:网络适配器 WebClient | 更新日期: 2023-09-27 18:21:18

我正在使用WebClient尝试从本地连接到我的电脑的硬件中获取字符串响应。我的电脑有一个连接到局域网的网络适配器和一个只连接到我硬件的第二个适配器。

如果我将IE与URL一起使用:http://169.254.103.127/set.cmd?user=admin+pass=1234678+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");
        }

如果我禁用了连接到局域网的网络适配器,但在其他情况下超时,则此片段有效。

有人能解释为什么会发生这种情况,以及我需要做什么才能将请求路由到正确的网络吗?

WebClient和多个网络适配器

您的问题依赖于网络适配器使用的默认度量。

简短回答

到达您的本地适配器设置(连接到您设备的适配器)->属性->IP v4属性->高级->取消选中自动度量->设置一个默认值,如900。

解释

Metric是您的操作系统用来为某个目的地选择最佳方式的方法(大多数情况下,当您有一条以上的路线可用于同一目的地时)

您的LAN适配器可能有一个默认网关,在该网关上,度量由您的操作系统自动定义。由于此网关是手动或由DHCP定义的,默认情况下,Windows将在此适配器上使用比其他具有自动链接本地地址的适配器更好的度量。

这意味着您的操作系统将优先选择默认网关(LAN),以转到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

将代理设置为null解决了我的问题,这就是完成的函数:

private String SendCommand(String command)
    {
        String response = null;
        using (WebClient client = new WebClient())
        {
            client.Proxy = null;
            response = client.DownloadString(command);
        }
        return response;
    }