Tôi đang thử nghiệm với API Heroku bằng cách sử dụng .NET System.Net.Http.HttpClient
. Cụ thể, tôi muốn keep-alive
hoạt động để tôi có thể gửi nhiều yêu cầu HTTP bằng một kết nối TCP và chỉ thực hiện một lần bắt tay SSL thay vì thiết lập kết nối TCP với bắt tay SSL theo yêu cầu.Kết nối tiếp tục không hoạt động với System.Net.Http.HttpClient trên một số máy chủ nhất định
Tôi đang thử nghiệm với https://api.heroku.com/status cung cấp HTTP 200 tốt đẹp và sử dụng Wireshark để giám sát lưu lượng truy cập TCP.
Google Chrome, ApacheBench (với cờ -k
) và cuộn tròn tất cả dường như có thể giữ kết nối TCP mở và gửi nhiều yêu cầu. HttpClient, không quá nhiều. Tôi cũng đã thử nghiệm HttpClient đối với các máy chủ khác (ví dụ: https://google.com/ và ở đó tôi chỉ thấy một thiết lập bắt tay/TCP SSL. Vì vậy, có vẻ như đó là một tương tác xấu giữa HttpClient và API Heroku. với:
private static async void TestUrl(string url)
{
using (var client = GetClient())
{
await client.GetAsync(url);
await client.GetAsync(url);
await client.GetAsync(url);
await client.GetAsync(url);
}
}
private static HttpClient GetClient()
{
var requestHandler = new HttpClientHandler
{
UseCookies = false,
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip,
};
return new HttpClient(requestHandler);
}
tôi cũng gắn một ảnh chụp màn hình Wireshark cho thấy cách HttpClient quyết định để thiết lập lại (RST
) kết nối ngay sau khi nó được thực hiện dữ liệu nhận
Bất kỳ đề xuất nào về những gì đang xảy ra ở đây?
Fiddler hiển thị thông tin gì? Nếu họ thương lượng HTTP 1.0, thì bạn cần tiêu đề Keep-Alive rõ ràng. –
@StephenCleary Google Chrome hiển thị HTTP/1.1 – friism
Tôi có nghĩa là giữa 'HttpClient' và Heroku. –