C# WebClient和多个网络适配器

C# WebClient和多个网络适配器,c#,webclient,C#,Webclient,我正在使用WebClient尝试从本地连接到我的电脑的硬件获取字符串响应。我的电脑有一个连接到LAN的网络适配器和一个仅连接到我的硬件的第二个适配器 如果我将IE与URL一起使用:我会得到一个字符串作为响应。我正试图使用以下代码片段实现同样的目标: using (WebClient client = new WebClient()) { client.Proxy = WebRequest.DefaultWebProxy; clien

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

如果我将IE与URL一起使用:我会得到一个字符串作为响应。我正试图使用以下代码片段实现同样的目标:

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的网络适配器,则此代码段有效,否则超时


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

您的问题取决于网络适配器使用的默认指标

简短回答

进入本地适配器设置(连接到设备的适配器)->Properties->ipv4 Properties->Advanced->Uncheck Automatic metric->Put一个默认值,如900

解释

度量是您的操作系统用于为某个目的地选择最佳方式的度量(主要是当同一目的地有多条可用路由时)

您的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时,对169.254.103.127的ping将采用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;
    }

你为什么要用代理?只需将
client.Proxy
设置为null。现在,它使用IE的代理设置。您是否尝试过在不指定任何其他内容的情况下进行简单的调用?如果您使用Fiddler观察IE中发生的情况,是否有任何auth质询响应或其他感兴趣的内容?我不认为WebClient提供了一种方法来设置出站套接字连接的
Bind
调用期间使用的端点;如果没有,您可能必须使用自己的
套接字
调用…还要注意,169.254.x.x意味着麻烦-设备试图获取DHCP地址,但失败,为自己分配了169.254.x.x范围内的随机IP。您的内部LAN和设备应使用不同的子网,例如
10.x.x.x
192.168.x.x
。网络子系统将根据其子网设置选择适配器。如果第二个适配器设置不正确,即使IE也只是偶然工作。