2010-02-12 34 views
9

Sau khi googling trong vài ngày, tôi thực sự không thể giải quyết vấn đề được mô tả. Hy vọng ở đây sẽ tìm thấy một giải phápGetRequestStream ném ngoại lệ hết thời gian một cách ngẫu nhiên

Tôi đang sử dụng mã được đính kèm khi gọi dịch vụ WCF trên cùng một máy chủ. Tôi nhận được lỗi Timeout ngẫu nhiên trong WebReq.GetRequestStream call()

Khi tôi kiểm tra netstat tôi thấy rằng kết nối vẫn mở, như vậy có lẽ là có một vấn đề, nhưng tôi không biết làm thế nào để giải quyết nó

 //request inicialization 
     HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(url); 
     WebReq.Method = "POST"; 
     WebReq.ContentType = "application/json; charset=utf-8"; 
     WebReq.ContentLength = buffer.Length; 

     WebReq.Proxy = null; 
     WebReq.KeepAlive = false; //also tried with true 
     WebReq.AllowWriteStreamBuffering = false; //also tried with true 

     //this produces an error 
     using (Stream PostData = WebReq.GetRequestStream()) 
     { 
      PostData.Write(buffer, 0, buffer.Length); 
      PostData.Close(); 
     } 

     //open and read response 
     HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 
     Stream Answer = WebResp.GetResponseStream(); 
     StreamReader _Answer = new StreamReader(Answer); 

     WebResp.Close(); 

     //return string 
     return _Answer.ReadToEnd(); 

Thời gian chờ được ném chủ yếu sau khoảng 10 giây không hoạt động, nhưng cũng sau năm yêu cầu trong hàng. Thực sự không thể tìm thấy một mô hình.

Điều gì có thể sai với mã này? Có cách nào khác (tốt hơn) để gọi dịch vụ WCF không?

Trả lời

12

Tôi không biết rằng nó chắc chắn chịu trách nhiệm cho sự cố, nhưng bạn chỉ đóng phản hồi web nếu nó không ném ngoại lệ và bạn không bao giờ đóng luồng phản hồi. Sử dụng using báo cáo:

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    return reader.ReadToEnd(); 
} 

này cũng có thể giải thích được vấn đề, như nếu bạn để lại một phản ứng mở nó sẽ tiếp tục kết nối đến máy chủ web mở - có nghĩa là kết nối tổng hợp sau đó không thể sử dụng kết nối đó.

+0

Đó là một chút tốt hơn, nhưng tôi vẫn nhận được thời gian chờ. Vì vậy, nó thực sự kỳ lạ. Vì vậy, sau khi nhấp vào liên kết thứ nhất là Tải và Tải và nếu trong thời gian đó, nhấp vào cùng hoặc bất kỳ liên kết nào khác trên trang, sau đó tải trang trong lần thứ hai hoặc lâu hơn. Vì vậy, có cái gì đó sai trái với việc tạo kết nối. Như tôi giả sử – AnzeR

+0

Tôi đã không phát hiện ra rằng nó đã được trên cùng một máy ... Tôi tự hỏi liệu bạn đang chạy ra khỏi thread thread thread - là những trong cùng một quá trình? –

+0

Tôi khá mới trong lập trình .net. Đã được lập trình trong PHP cho một số năm nay, và không bao giờ nhận thấy một vấn đề như vậy. Có những thứ này dễ dàng hơn nhiều. Vì vậy, tôi không chắc chắn những gì bạn đã có nghĩa là với "chủ đề hồ bơi thread"? Với một yêu cầu, tôi tạo hai hoặc nhiều yêu cầu HTTP này cho dịch vụ WCF, vì vậy nó có cùng một quy trình/yêu cầu. Tôi có nên sử dụng bộ nhớ đệm cho các yêu cầu này không? – AnzeR

0

Vì đây là hành vi thực sự lạ Tôi muốn biết nếu có bất kỳ cách nào khác để gọi dịch vụ WCF, được lưu trữ trên cùng một máy chủ IIS. Tôi cũng nghĩ rằng việc tạo kết nối TCP cho loại cuộc gọi đó không thực sự được tối ưu hóa và tất cả các cách tiếp cận khác sẽ nhanh hơn nhiều.

6

Tôi gặp vấn đề tương tự này, việc thêm cuộc gọi tới HttpWebRequest.Abort() dường như đã khắc phục được sự cố.

+0

Cảm ơn bạn đã giúp tôi khắc phục vấn đề của mình. kết nối đúng cách;) – pila

0

Điều đầu tiên cần lưu ý là xem xét URI, các thông số và các tiêu đề được gửi, cụ thể:

  • nhân vật được bảo lưu. Gửi ký tự dành riêng bởi URI có thể mang lại vấn đề ! * ' () ; : @ & = + $ ,/? # []
  • URI Length: Bạn không nên vượt quá 2000 ký tự
  • header Length: Hầu hết các máy chủ web làm kích thước giới hạn của tiêu đề họ chấp nhận. Ví dụ trong giới hạn mặc định của Apache là 8KB.

Hãy nhớ rằng nếu bạn muốn gửi dữ liệu từ độ dài dài hơn được khuyến nghị gửi nội dung thư.

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