C#HttpClient服务器超时取消所有后续请求

C#HttpClient服务器超时取消所有后续请求,c#,httpclient,dotnet-httpclient,C#,Httpclient,Dotnet Httpclient,我遵循了这个例子,成功地处理了C#HttpClient的超时问题,但我就是不能让它工作 var urls = new List<string> { "/success", "/willtimeout", "/success" }; var baseAddress = "http://endpoint"; var httpClient = new HttpClient(); httpClient.Timeout = new TimeSpan(0, 0, 30); httpClient.

我遵循了这个例子,成功地处理了C#HttpClient的超时问题,但我就是不能让它工作

var urls = new List<string> { "/success", "/willtimeout", "/success" };
var baseAddress = "http://endpoint";
var httpClient = new HttpClient();
httpClient.Timeout = new TimeSpan(0, 0, 30);
httpClient.BaseAddress = new Uri(baseAddress);
foreach (var url in urls)
{
    try
    {
        var cs = CancellationTokenSource.CreateLinkedTokenSource(CancellationToken.None);
        cs.CancelAfter(new TimeSpan(0, 0, 3));
        var result = await httpClient.GetAsync(urls, cs.Token);
        Console.WriteLine("Success");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}
如何在每次都不创建新的HttpClient的情况下使其正常工作

CreateLinkedTokenSource创建一个CancellationTokenSource,当任何源令牌处于取消状态时,该令牌将处于取消状态

所以我想这就是问题所在,每次只需创建新的令牌源,不要将其链接到任何东西:

try
{
    var cs = new CancellationTokenSource();
    // ...

我不能产生同样的结果,虽然我没有你的终点。端点在第三次呼叫时有响应吗?@dkackman在经过更多的调查和WireShark数据包嗅探后,如果我重新使用httpClient,则在第二次呼叫时SYN/ACK不会被发送到服务器。第二次呼叫超时,httpClient为第三次呼叫发送SYN/ACK,但服务器未应答,这会造成超时。当我不重复使用httpClient时,它会为每个请求发送一个SYN/ACK,而不会发生任何问题。这似乎是服务器问题?令人惊讶的是,这是由IIS7.5服务器提供的,这让我相信这将是一个代码问题。。。但是我真的很想知道这种锁是如何编码的。无论“/willtimeout”做什么,如果它使整个服务没有响应,听起来都像是做了一个数字。这是您控制的服务还是其他人的代码?不,我无法控制它。我曾尝试创建一个具有无限任务的服务器。Delay for/willtimeout,但无法重现目标服务器正在执行的确切行为。我也试着关闭连接。它不起作用。我必须解决这个问题,并为每个飞行中的请求使用一个HttpClient。如果请求不再有效,我可以重新使用它。如果请求超时,我将丢弃HttpClient。
try
{
    var cs = new CancellationTokenSource();
    // ...