2013-07-08 41 views
6

Tôi đang gặp sự cố lẻ, lẻ tẻ với một ứng dụng thử nghiệm đơn giản (ứng dụng bảng điều khiển Visual Studio) hoạt động như một cơ quan giám sát cho trang web được lưu trữ trên aspx (không phải ứng dụng) bằng cách gửi các yêu cầu http đơn giản và định thời gian phản hồi. Tôi đã sử dụng điều này trong nhiều tuần trong quá khứ mà không có vấn đề cụ thể này. Vào các thời điểm dường như ngẫu nhiên trong ngày, các yêu cầu http của tôi bắt đầu thất bại với lỗi ở trên. Chúng dường như hết thời gian chờ vì các yêu cầu thất bại đều mất 60 giây. Sau một khoảng thời gian lỗi nhất quán như trên (khoảng thời gian ngẫu nhiên từ một vài phút đến 90 phút trong một trường hợp) lỗi dừng và phản hồi http bắt đầu quay trở lại mà không có lỗi ở tốc độ bình thường (thường là khoảng 0,25s). Các yêu cầu của trình giám sát khách hàng kích hoạt một tra cứu cơ sở dữ liệu rất đơn giản, chỉ cần 1-2 dòng mã ở phía máy chủ. Điều này được lưu trữ tại một cửa sổ chia sẻ lưu trữ máy chủ web."Kết nối hiện có bị đóng bởi máy chủ từ xa" lỗi lẻ tẻ từ HttpWebRequest

Tôi cũng có thể kích hoạt hành vi này theo ý muốn bằng cách cập nhật mọi tệp .cs trên trang web lưu trữ của mình, trong đó, làm cho hồ bơi ứng dụng tái chế. Ngay lập tức ứng dụng cơ quan giám sát của tôi bắt đầu hẹn giờ lại với lỗi ở trên.

Nó có mùi giống như một số vấn đề kết nối tái chế, vì nếu tôi đơn giản khởi động lại ứng dụng cơ quan giám sát, nó hoạt động tốt và phản hồi bắt đầu quay lại với độ trễ bình thường.

Tôi đã thử đặt yêu cầu.KeepAlive = false và request.ServicePoint.ConnectionLimit = 1, những thứ đó không hữu ích.

Một đầu mối khác, tôi không thể kết nối với trình quản lý IIS đến một trong hai trang web khác nhau được lưu trữ trên máy chủ này, điều này luôn hoạt động tốt. Tôi nhận được "Kết nối cơ bản đã bị đóng" đang cố kết nối thông qua Trình quản lý IIS. Mỗi lần. Tôi đã không cập nhật một trong các trang web trong một thời gian, vì vậy nó không phải là bất kỳ thay đổi nào của tôi.

Đây là trang web asp.net 4 trên chương trình phụ trợ chạy trên IIS7 với một hồ bơi ứng dụng chuyên dụng trong chế độ đường ống tích hợp.

Ngoài ra nếu tôi thay đổi biến sleeptime trong ứng dụng cơ quan giám sát thành khoảng 30 giây, sự cố không hiển thị. Có một số ma thuật trong phạm vi của tôi tin rằng 10-20 giây, nơi nếu các yêu cầu được tạm dừng nhiều hơn thế, họ không bao giờ thất bại. Tôi nghĩ rằng thực tế là IIS Manager không thể kết nối là bằng chứng rõ ràng rằng có điều gì đó không đúng ở phía máy chủ của ứng dụng thử nghiệm của tôi, nhưng tôi muốn bao gồm các căn cứ của mình trước khi mở một sự cố hỗ trợ ... khởi động lại ứng dụng giao diện điều khiển của tôi khắc phục sự cố ... ít nhất là trong một thời gian.

class Program 
{ 
      //make a simple web request and just return the status code 
    static string SendHttpMsg(string url, string postData) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url)); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     ASCIIEncoding encoding = new ASCIIEncoding(); 
     byte[] byte1 = encoding.GetBytes(postData); 
     request.ContentLength = byte1.Length; 
     //request.KeepAlive = false; //no effect 
     //request.ServicePoint.ConnectionLimit = 1; //no effect 
     Stream requestStream = request.GetRequestStream(); 
     requestStream.Write(byte1, 0, byte1.Length); 
     requestStream.Close(); 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     response.Close(); 
     return ((int)response.StatusCode).ToString(); 
    } 

    static void Main(string[] args) 
    { 
     int sleeptime = 5000; 
     string result = ""; 
     while (true) 
     { 
      DateTime start = DateTime.Now; 
      try 
      { 
       //this is a very simple call that results in a very simple, fast query in the database 
       result = SendHttpMsg("http://example.com/somepage.aspx", "command=test"); 
      } 
      catch (Exception ex) 
      { 
           //fancy exception handling here, removed 
      } 
      DateTime end = DateTime.Now; 
      TimeSpan calltime = end - start; 
      Console.WriteLine(end.ToString() + ", " + calltime.TotalSeconds.ToString("F") + " seconds " + result); 
      Thread.Sleep(sleeptime); 
     } 
    } 
} 

Trả lời

4

Bạn có thể có các kết nối đang treo lơ lửng và trong HTTP 1.1 bạn bị giới hạn trong 2 kết nối.

Hãy thử changing the HTTP Protocol Version used in the request:

request.ProtocolVersion = HttpVersion.Version10; 

Nếu điều đó không làm việc, nó có thể được tham gia một long time to resolve the proxy settings, có thể được cố định bằng cách tắt các thiết lập proxy trong ứng dụng của bạn bằng cách thêm dòng sau vào file .config:

<system.net> 
    <defaultProxy enabled="false"> 
    <proxy/> 
    <bypasslist/> 
    <module/> 
    </defaultProxy> 
</system.net> 

Nếu một trong các cách trên khắc phục được sự cố, tôi khuyên bạn nên thêm ... thử ... cuối cùng chặn mã yêu cầu của bạn, để đảm bảo rằng mỗi yêu cầu được đóng và xử lý đúng cách (thử thiết lập request = null i n câu lệnh cuối cùng của bạn bên trong phương thức).

+0

Cảm ơn bạn đã đặt yêu cầu.ProtocolVersion = HttpVersion.Version10 giải quyết được sự cố, điều này làm cho bạn rõ ràng là đúng, các kết nối dangling, dẫn tôi đến http: // stackoverflow.com/questions/5827030/httpwebrequest-times-out-on-second-call ... giải pháp đã thêm cả request.ServicePoint.ConnectionLeaseTimeout = 5000 và request.ServicePoint.MaxIdleTime = 5000, trong trường hợp tái chế trang web, kết nối cục bộ được tái chế trong thời gian trễ vòng lặp của tôi. Hoạt động tốt ngay bây giờ! –

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