2009-06-21 24 views
10

Tôi nhận được một số hành vi rất lạ với HttpWebRequest Tôi hy vọng ai đó có thể giúp tôi. Tôi có một ứng dụng giao diện điều khiển mà một số tập hợp làm việc bằng cách sử dụng các HttpWebRequest đối tượng để lấy nội dung của một trang web mục tiêu. Do tính chất của yêu cầu, ứng dụng đa luồng và cố gắng thực hiện bất cứ nơi nào giữa 10 và 30 kết nối đồng thời (Tôi đã thử nghiệm với một loạt các giá trị). Yêu cầu web thực sự được cấu trúc như sau:Tại sao hiệu suất của đối tượng HttpWebRequest cải thiện khi sử dụng Fiddler?

var req = (HttpWebRequest)WebRequest.Create(url); 
WebResponse resp = req.GetResponse(); 
Stream s = resp.GetResponseStream(); 
var sr = new StreamReader(s, Encoding.ASCII); 
string doc = sr.ReadToEnd(); 
sr.Close(); 
resp.Close(); 
return doc; 

Dù sao, các hành vi lạ là điều kiện bình thường các ứng dụng được đạt khoảng 120 yêu cầu mỗi phút nhưng nếu tôi mở ra Fiddler nó nhảy lên khoảng 600. Sử dụng Windows 7 Theo dõi tài nguyên Tôi có thể thấy hoạt động mạng tăng tương ứng. Các kết nối TCP cho quá trình giao diện điều khiển bây giờ liệt kê địa chỉ từ xa là "IPv4 loopback" thay vì địa chỉ IP của máy chủ đích (được mong đợi). Tôi đã tự hỏi về số lượng yêu cầu HTTP đồng thời tối đa cho phép bởi máy nhưng thay đổi điều này trong sổ đăng ký dường như không tạo nên sự khác biệt.

Vì vậy, câu hỏi là; nó là gì về việc chạy Fiddler mà đột nhiên tăng thông lượng năm lần và làm thế nào tôi có thể đạt được điều này tự nhiên trên máy mà không cần phải khởi động một công cụ khác?

Cảm ơn!

+0

Tôi có cùng một vấn đề. Nhưng tôi có ứng dụng WinForm .. Và tôi không thể tìm thấy cách sửa lỗi này với ứng dụng winform .. –

Trả lời

14

Hình như bây giờ tôi đã có thể để có được những thông phải lên (tăng gấp đôi mà tôi đã nhận được với Fiddler mở trên thực tế) bằng cách thiết lập các kết nối tối đa trong App.config:

<system.net> 
    <connectionManagement> 
    <add address="*" maxconnection="30" /> 
    </connectionManagement> 
</system.net> 

Rất hạnh phúc với kết quả nhưng vẫn còn một chút bí ẩn là tại sao Fiddler mở thay đổi kết quả rất đáng kể.

+5

Dự đoán của tôi là giá trị maxconnectionperproxy mặc định cao hơn giá trị maxconnection mặc định. – EricLaw

+0

Đây là một cuộc sống tiết kiệm. Cảm ơn! – Scrappydog

5

Một điều tôi nhận thấy ngay lập tức là bạn không triển khai sử dụng các khối. Điều đó cho biết thêm một yếu tố ngẫu nhiên có thể được nhân với số lượng yêu cầu, vì vậy tôi đề nghị bạn khắc phục điều đó:

var req = WebRequest.Create(url); 
using (WebResponse resp = req.GetResponse()) 
{ 
    using (Stream s = resp.GetResponseStream()) 
    { 
     using (var sr = new StreamReader(s, Encoding.ASCII)) 
     { 
      return sr.ReadToEnd(); 
     } 
    } 
} 

Tiếp theo, FYI, Fiddler hoạt động như một proxy. Nếu proxy mặc định của bạn được thiết lập để sử dụng tập lệnh để thiết lập cấu hình proxy, thì tôi tự hỏi liệu việc chạy Fiddler có thể không xóa thời gian cần thiết để thiết lập tập lệnh hay không. Điều đó có thể xảy ra chỉ một lần, thay vì trên mỗi yêu cầu.

+0

Điểm tốt John, cảm ơn vì đã nâng cao điều đó. –

1

Tôi gặp sự cố tương tự như của bạn và muốn chia sẻ độ phân giải của tôi.

Tóm lại, tôi đã có một chương trình điều khiển đã tạo yêu cầu HTTP và có thể, sau 15 phút hoặc lâu hơn, hết giờ. Tuy nhiên, nếu tôi sử dụng Fiddler thì tôi không bao giờ trải qua thời gian chờ, ngay cả sau khi nó chạy trong nhiều ngày liền.

Tôi đã thử đặt thuộc tính maxconnections trong App.config, nhưng điều đó dường như không giúp gì cả. Sau đó tôi đã đi vào và mỗi và mọi tham chiếu đến HttpWebRequest, HttpWebResponse và các đối tượng luồng được sử dụng để đọc/ghi dữ liệu đến các đối tượng này trong khi sử dụng các khối.

Điều đó dường như để thực hiện thủ thuật. Tôi đã chạy gần 24 giờ mà không có thời gian chờ và không có Fiddler chạy.

0

Cách bạn truy vấn nguyên nhân tạo phiên mới cho mỗi cuộc gọi, là chi phí, có thể là người lập trình thêm phiên vào truy vấn của bạn ....

thử

riêng tĩnh CookieContainer _cookieContainer = new CookieContainer();

_httpWebRequest.CookieContainer = _cookieContainer; // với việc tái chế cookiecontainer

0

Chúng tôi đã gặp vấn đề tương tự, đặt httpWebRequest.PreAuthenticate thành true.

bạn không nên có 401 phản ứng nữa, do đó bạn sẽ mở kết nối ít ...

0

Đối với tôi, tôi đã thiết lập request.ProtocolVersion = HttpVersion.Version10;

Cài đặt mặc định cho điều này là HttpVersion.Version11. Khi tôi đặt điều này trở lại mặc định, các yêu cầu của tôi sẽ nhanh hơn nhiều mà không có sự khó chịu.

Tôi hy vọng điều này sẽ giúp người khác, nó đưa tôi tất cả các buổi sáng để tìm ra điều này!

Các vấn đề liên quan