gpt4 book ai didi

C# 发送 Web 请求而不在失败时抛出异常

转载 作者:行者123 更新时间:2023-12-04 07:49:23 27 4
gpt4 key购买 nike

我正在测试大量公共(public)代理的有效性。由于此集合的大小,最佳吞吐量是必要的。这很简单,可以使用 HttpWebRequest/Task 来实现,但是,由于许多代理无效,它会导致抛出许多异常。这些捕获的异常在我的应用程序中造成了糟糕的性能。根据我的研究,我发现异常具有显着的性能开销。
我想也许 Socket 类会是一个很好的解决方案,但很快发现它在无法连接到远程端点时也会抛出异常。这是有道理的,但在我的用例中,我不希望连接失败导致异常,类似于 .NET 框架中存在的各种方法(如 TryParse)。据我所知,对于我想要实现的目标,不存在类似的方法。
我想执行直接系统调用以使用 C# 执行 Web 请求。我觉得我需要进入较低的抽象级别才能实现我所描述的行为,但我愿意接受并感谢任何人的意见。如果我认为需要系统调用是正确的,那么任何示例代码都会非常有益。
当前实现:

private async Task Validate()
{
var proxies = new List<string>(); //In actual use, this contains 10,000+ proxies
var tasks = new List<Task>();
foreach (var proxy in proxies)
{
tasks.Add(IsValid(proxy));
}
await Task.WhenAll(tasks);
}

private async Task<bool> IsValid(string proxy)
{
try
{
var req = HttpWebRequest.Create("http://example.com");
req.Proxy = new WebProxy(proxy);
var resp = await req.GetResponseAsync();
using (var stream = resp.GetResponseStream())
{
using (var reader = new StreamReader(stream))
{
var html = await reader.ReadToEndAsync();
if (html.Contains("<title>Example Domain</title>"))
{
return true;
}
else
{
return false;
}

}
}
}
catch (Exception)
{
return false;
}
}

最佳答案

可以减少先使用 PING 协议(protocol)时的异常次数,看看被测代理服务器是否真的在线。这将捕获很多简单的案例。对于 PING,您不需要异常处理。您也可以并行执行这两种协议(protocol)。

关于C# 发送 Web 请求而不在失败时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67054155/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com