如何在UWP中使用HttpClient时快速检查具有IP地址范围的http成功200



我想在通用Windows平台中使用类HttpClient快速检查本地网络中IP地址的范围,以获得给定URI的http成功200

如果成功,则添加到列表中。如果失败快速放弃,则转到迭代中的下一个。

这是我使用的示例代码。

private async void ScanLocalNetwork()
{
        string localIpAddress = GetLocalIpAddress();
        if (!string.IsNullOrEmpty(localIpAddress))
        {
            List<IPAddress> IpAddressList = new List<IPAddress>();
            IpAddressList = GetListOfLocalIpAddresses(localIpAddress);
            ListOfScannedIpAddresses = new ObservableCollection<string>();
            foreach (var ipAddress in IpAddressList)
            {                    
                IsSearchingVisible = true; //show progress ring for list
                var validAddress = await SendHttpRequest(ipAddress.ToString());
                if (validAddress)
                {
                    ListOfScannedIpAddresses.Add(ipAddress.ToString());                        
                }
            }
            IsIpListVisible = true;
            IsSearchingVisible = false;
        }
}
private async Task<bool> SendHttpRequest(string ipAddressToCheck)
    {
        HttpResponseMessage reposneMsg;
        string address = String.Empty;

        address = "http://" + ipAddressToCheck + "/RemoteControl/Volume/get";
        var uri = new Uri(address, UriKind.Absolute);
        using (HttpClient client = new HttpClient())
        {
            //IsChecking = true;
            try
            {
                reposneMsg = await client.GetAsync(uri);
                return reposneMsg.IsSuccessStatusCode;
            }
            catch (Exception)
            {
                return false;
            }
        }
    }

这种方法很慢,但有效。知道怎么加快速度吗?

不要等到上一个任务完成后再调用SendHttpRequest。

您可以将它们全部添加到Task[],然后在最后调用WhenAll。类似这样的东西:

Task[] tasks = new Task[IpAddressList.Count];
for (int i = 0; i < IpAddressList.Count; i++)
{
    Task task = SendHttpRequest(IpAddressList[i].ToString());
    tasks[i] = task;
}
await Task.WhenAll(tasks);

除此之外,您可以将HttpClient Timeout设置为更短的值,以使请求更快地超时。

client.Timeout = TimeSpan.FromMilliseconds(4000);

编辑:我根据评论更新了代码!

编辑2:将任务结果添加到任务数组后,您将立即对其进行评估,这违背了目的。首先启动所有任务,然后等待它们全部完成,然后浏览任务结果列表并获取所需的IP地址。

Task[] tasks = new Task[IpAddressList.Count];
for (int i = 0; i < IpAddressList.Count; i++)
{
    Task<bool> task = SendHttpRequest(IpAddressList[i].ToString());
    tasks[i] = task;
}
await Task.WhenAll(tasks);
for (int i = 0; i < tasks.Length; i++)
{
    if (tasks[i].Result)
    {
        ListOfScannedIpAddresses.Add(IpAddressList[i].ToString());
    }
}

最新更新