2016-04-01 11 views
9

Tôi gặp sự cố hiệu suất thấp với các yêu cầu HTTP trên .NET. Yêu cầu HTTP GET tới một API REST trên localhost mất khoảng 500 ms để hoàn tất. Tôi đã dành rất nhiều thời gian để sửa chữa nó. Tôi đã thử nhiều cách: HttpClient, HttpWebRequest, WebClientRestSharp. Không ai trong số họ làm việc. Hầu hết các giải pháp trên Internet cho biết để đặt tham số Proxy thành null nhưng vẫn không hoạt động nhanh hơn.C# Cách đặt HttpClient Keep-Alive thành false

Cách duy nhất tôi tìm thấy để giảm thời gian này là để thiết lập các thông số Giữ-Alive đề nghị false:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
request.Method = "GET"; 
request.KeepAlive = false; 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

này hoạt động tuyệt vời. Thời gian giảm xuống còn 7-10 ms. Nhưng bây giờ trong một số lý do tôi cần phải sử dụng HttpClient thay vì HttpWebRequest. Và tôi không thể tìm cách đặt Keep-Alive thành false cho HttpClient. Điều duy nhất tôi tìm thấy là làm thế nào để thiết lập nó thành true bằng cách thiết lập một "kết nối" tiêu đề để "Giữ-Alive".

Tôi đang sử dụng mã này cho yêu cầu POST bởi HttpClient:

 HttpClient _http = new HttpClient(); 
     _http.DefaultRequestHeaders.Accept.Clear(); 
     _http.DefaultRequestHeaders.Add("Connection", "Keep-Alive"); 
     _http.DefaultRequestHeaders.Add("Keep-Alive", "timeout=600"); 

     var content = new StringContent(
      request, Encoding.UTF8, "application/%appname%+xml"); 
     content.Headers.ContentType.Parameters.Add(
      new NameValueHeaderValue("type", "payload")); 

     HttpResponseMessage response = await _http.PostAsync(uri, content); 

Và nó vẫn mất khoảng 500-600 ms để hoàn thành.

+0

http://stackoverflow.com/questions/15211812/using-a-keep-alive-connection-in-winrts-httpclient-class ... chỉ là một ý tưởng ... –

+0

@AndreasNiedermair Cảm ơn, đây là lần đầu tiên trong kết quả tìm kiếm của Google. Tôi đã thử điều này: content.Headers.Add ("Keep-Alive", "false"); Nhưng điều này mất hơn 500 ms để hoàn thành quá. – Vaskrol

Trả lời

1

Xem mã bên dưới:

HttpClient cli; 
... 
cli.DefaultRequestHeaders.Add("Connection", "keep-alive"); 
cli.DefaultRequestHeaders.Add("Keep-Alive", "600"); 
+0

Nó không hoạt động. Tôi đã cập nhật câu hỏi với mã của mình. – Vaskrol

+0

Mẫu bạn đã đăng "hoạt động tuyệt vời" tương đương với KeepAlive = False. Tiêu đề bạn nói bạn đã thử là tương đương với KeepAlive = True. Bạn đang làm ngược lại với những gì bạn cần làm. – Matt

16

Khi bạn thiết lập HttpWebRequest.KeepAlive = true bộ tiêu đề là kết nối: giữ-sống

Khi bạn thiết lập HttpWebRequest.KeepAlive = false bộ tiêu đề được kết nối: gần

Vì vậy, bạn sẽ cần

_http.DefaultRequestHeaders.Add("Connection", "close"); 
Các vấn đề liên quan