2010-03-19 16 views
8

Sto tentando di effettuare una chiamata di richiesta di servizio Web a un sito Web di terze parti il ​​cui server è un po 'inaffidabile. C'è un modo per impostare un timeout su una richiesta a questo sito? Qualcosa di simile a questo pseudo codice:Timeout richiesta Web in .NET

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

risposta

21

è possibile utilizzare la proprietà Timeout:

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:

Per rispondi alla domanda nella sezione commenti su XElement.Load(uri) si potrebbe effettuare le seguenti operazioni:

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

I' Lo proverò e ti farò sapere come funziona. Posso inserire tutto questo in un'istruzione catch try in modo che possa restituire un messaggio di errore se scade? – Victor

+0

Ovviamente, mettere try/catch è ciò che è necessario per gestire l'eccezione e restituire un messaggio corretto. –

+0

Questo potrebbe essere per un'altra domanda, ma sai come posso usarlo anche con Xelement.Load (uri)? – Victor

2

Forse si dovrebbe andare con

System.Net.WebRequest.Timeout
proprietà

0

Molte classi all'interno .NET Framework che coinvolgono qualsiasi tipo di rete includono una proprietà Timeout. Ad esempio, esiste una proprietà di questo tipo nella classe WebRequest (System.Net)

3

WebClient non supporta naturalmente i timeout personalizzati. Ma si può facilmente costruire una classe derivata con timeout personalizzati:

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; 
    } 
} 

Fonte: 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

Si potrebbe verificare la presenza di eccezione WebTimeout dal lato server quindi utilizzare SignalR di inviare attivamente messsage timeout di nuovo ai clienti:

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!"); 
    } 
} 

Tutte how to setup SignalR for asp.net here