2013-07-27 42 views
7

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

Wireshark screenshot

.

Bất kỳ đề xuất nào về những gì đang xảy ra ở đây?

+0

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. –

+0

@StephenCleary Google Chrome hiển thị HTTP/1.1 – friism

+0

Tôi có nghĩa là giữa 'HttpClient' và Heroku. –

Trả lời

0

Một số máy chủ proxy sẽ bỏ qua phần còn lại khi thực hiện xác thực của chúng. Nếu tôi nhớ chính xác nó là khi máy chủ proxy sử dụng xác thực NTLM.

Trước đây, tôi phải thêm một phần một phần để "trợ giúp" một số lớp proxy dịch vụ web.

Tôi overrode phương pháp GetWebRequest (Uri uri) với

System.Net.HttpWebRequest webRequest = 
     (System.Net.HttpWebRequest)base.GetWebRequest(uri); 
webRequest.ProtocolVersion = HttpVersion.Veraion10; // I know this is strange, but it works 
webRequest.ServicePoint.Expect100Continue = false; // This is where the magic lives 
return webRequest;