2013-02-26 29 views
6

Đối với dịch vụ web C# liên hệ với một nhóm máy chủ khác có giới hạn, tôi muốn tạo 1 hồ bơi kết nối HTTP trên mỗi máy chủ mà tôi muốn có thể liên hệ.Có thể ghép nối kết nối HTTP không?

Khái niệm cơ bản của khóa học:

  • Mỗi hồ bơi nên mở một vài kết nối (3 kết nối?) Đến máy chủ web từ xa của nó, và giữ những kết nối còn sống.
  • Nên sử dụng thời gian tối đa để tái chế (ngắt kết nối/kết nối lại) các kết nối với máy chủ web từ xa, ngăn máy chủ web từ xa ngắt kết nối trước khi chúng tôi thực hiện.
  • Không nên tạo đồng thời các kết nối nhưng với một chút tạm dừng giữa 3 kết nối để việc tái chế cũng không xảy ra đồng thời.
  • Nếu máy chủ web từ xa vẫn ngắt kết nối đột ngột, cần lưu ý và chúng ta nên kết nối lại.
  • Nếu không thể kết nối lại vì một số lý do, việc thử lại phải được thực hiện sau một chút tạm dừng.

Bằng cách này, khi tôi muốn gửi một HttpWebRequest, tôi đã sẵn sàng để sử dụng các kết nối, tiết kiệm thời gian thiết lập kết nối tại thời điểm mà tôi muốn sử dụng nó.

Hiện tại tôi không biết đây có phải là tính năng mặc định của HttpWebRequest hay không. Vì vậy, xin lỗi nếu tôi yêu cầu cho rõ ràng. Googling cho điều này chỉ dẫn tôi đến các câu hỏi tương tự cho Java.

Câu hỏi 1: có điều gì đó có trong .NET/C# không?

Câu hỏi 2: nếu không, có tài nguyên nào trên hiện tại này trên internet mà bạn biết không?

Câu hỏi 3: nếu không, cách tiếp cận xây dựng một bản thân?

+0

Liên quan: [HTTP Connection Pooling] (http://stackoverflow.com/questions/15077526/http-connection-pooling) – slugster

+0

Xin lỗi nếu tôi hiểu lầm câu hỏi của bạn, hoặc ngữ cảnh của nó, nhưng không phải là điều này đơn giản là xong bằng cách sử dụng WebSockets/bỏ phiếu dài trong .NET? SignalR sẽ hoạt động tốt. –

Trả lời

3

HttpWebRequest (về cơ bản có nghĩa là tất cả các API của HTTPS trong .net) đã sử dụng kết nối tổng hợp theo mặc định.

Hãy xem các lớp ServicePointServicePointManager nếu bạn cần quản lý bất kỳ thông số nào của hồ bơi kết nối.

+0

Tôi đã phân tích các gói tcp để tìm hiểu những gì đang diễn ra. Có vẻ như HttpWebRequest tái sử dụng một kết nối nếu nó có thể hỗ trợ giữ cho cuộc sống, nhưng nó không tích cực cố gắng giữ cho nó sống. Theo cách thủ công (không có C#), tôi có thể giữ kết nối với Apache bằng cách gửi một (Không có lệnh HTTP NOOP ?!) dòng mới đơn giản "\ n" cứ 10 giây để tránh hết thời gian chờ Apache, nhưng tôi không Không nghĩ đây là cách chính thức để làm điều đó. Tôi cũng có thể thực hiện yêu cầu HEAD, điều đó cũng nên giữ kết nối còn sống, nhưng yêu cầu Keep-Alive và tạo thêm lưu lượng truy cập –

+0

Điều tôi muốn thấy là C# giữ kết nối luôn hoạt động (giống như những gì tôi có thể thực hiện theo cách thủ công). Và sau khi ngắt kết nối vì bất kỳ lý do nào (Thời gian chờ đạt được, KeepAliveTimout đã đạt được, MaxKeepAliveRequests đã đạt được), rằng C# sẽ kết nối lại trực tiếp và không đợi cho đến khi tôi muốn sử dụng lại kết nối. –

+0

Ow và BTW. Tôi đã có thể thấy rằng HttpWebRequest sử dụng cùng một ServicePoint hơn và hơn khi nó có thể. Và đã xác nhận nó với httpWebRequest.ServicePoint.GetHashCode().Nhưng mặc dù kết nối bị ngắt kết nối, trước khi bạn thực hiện một yêu cầu mới, C# chỉ kết nối lại một cách lặng lẽ và trả về cùng một mã băm. Vì vậy, ServicePoint và hashcode vẫn giữ nguyên, nhưng nó là một kết nối mới, không may là chỉ được thiết lập khi bạn cố gắng sử dụng. –