2010-03-19 39 views
8

Tôi đang cố gắng thực hiện yêu cầu dịch vụ web gọi tới trang web phần thứ ba mà máy chủ không đáng tin cậy. Có cách nào tôi có thể thiết lập một thời gian chờ trên một yêu cầu đến trang web này? Một cái gì đó giống như mã giả này:Thời gian chờ yêu cầu web trong .NET

try // for 1 minute 
{ 
    // Make web request here 
    using (WebClient client new WebClient()) //...etc. 
} 
catch 
{ 
} 

Trả lời

21

Bạn có thể sử dụng Timeout tài sản:

var request = (HttpWebRequest)WebRequest.Create("http://www.google.com"); 
request.Timeout = 1000; //Timeout after 1000 ms 
using (var stream = request.GetResponse().GetResponseStream()) 
using (var reader = new StreamReader(stream)) 
{ 
    Console.WriteLine(reader.ReadToEnd()); 
} 

UPDATE:

Để trả lời câu hỏi trong phần bình luận về.210 bạn có thể làm như sau:

var request = (HttpWebRequest)WebRequest.Create("http://stackoverflow.com/feeds"); 
request.Timeout = 1000; //Timeout after 1000 ms 
using (var stream = request.GetResponse().GetResponseStream()) 
using (var reader = new StreamReader(stream)) 
{ 
    var xel = XElement.Load(reader); 
} 
+0

tôi sẽ thử điều này và cho bạn biết nó hoạt động như thế nào. Tôi có thể đặt tất cả điều này trong câu lệnh bắt thử để tôi có thể trả lại thông báo lỗi nếu nó hết hạn không? – Victor

+0

Tất nhiên, việc đặt thử/nắm bắt là những gì bạn cần để xử lý ngoại lệ và trả lại một thông điệp thích hợp. –

+0

Điều này có thể là một câu hỏi khác, nhưng bạn có biết làm thế nào tôi cũng có thể sử dụng điều này với Xelement.Load (uri)? – Victor

2

Có lẽ bạn nên đi với

System.Net.WebRequest.Timeout
tài sản

0

Nhiều lớp học trong khuôn khổ Net có liên quan đến bất kỳ loại mạng bao gồm một tài sản Timeout. Ví dụ: có một thuộc tính như vậy trên lớp WebRequest (System.Net)

3

WebClient không tự nhiên hỗ trợ hết thời gian chờ tùy chỉnh. Nhưng bạn có thể dễ dàng xây dựng một lớp học có nguồn gốc với timeouts tùy chỉnh:

public class TimeoutWebClient : WebClient 
{ 
    private int _timeOut = 10000; 
    public int TimeOut 
    { 
     get 
     { 
      return _timeOut; 
     } 
     set 
     { 
      _timeOut = value; 
     } 
    } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     WebRequest webRequest = base.GetWebRequest(address); 
     webRequest.Timeout = _timeOut; 
     return webRequest; 
    } 
} 

Nguồn: http://aspadvice.com/blogs/maniknet/archive/2008/06/16/Ganz-kurz_3A00_-WebClient-mit-eigenem-Verbindungs-Timeout-_2800_WebClient-with-a-custom-connection-timeout_2900_.aspx

1

Bạn có thể kiểm tra WebTimeout ngoại lệ từ phía máy chủ sau đó sử dụng SignalR tích cực gửi Thông tin về thời gian chờ lại cho khách hàng:

var request = (HttpWebRequest)WebRequest.Create("http://www.your_third_parties_page.com"); 
request.Timeout = 1000; //Timeout after 1000 ms 

try 
{ 
    using (var stream = request.GetResponse().GetResponseStream()) 
    using (var reader = new StreamReader(stream)) 
    { 
     Console.WriteLine(reader.ReadToEnd()); 
    } 
} 
catch (WebException ex) 
{ 
    if (ex.Status == WebExceptionStatus.Timeout) 
    { 
     //If timeout then send SignalR message to inform the clients... 
     var context = GlobalHost.ConnectionManager.GetHubContext<YourHub>(); 
     context.Clients.All.addNewMessageToPage("This behavious have been processing too long!"); 
    } 
} 

Xem thêm how to setup SignalR for asp.net here

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