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

How to fast check for http success 200 having range of IP addresses while using HttpClient in UWP

我想在通用 Windows 平台

中使用 class HttpClient 快速检查给定 URI 的 http 成功 200 的 IP 地址范围

如果成功添加到列表。如果失败快速放弃,进入下一个迭代。

这是我使用的示例代码。

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[],然后再添加到 call WhenAll in the end。像这样:

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());
    }
}