C# WebClient extension class con Request Timeout personalizzato Estensione gratuita e open source della classe System.Net.WebClient che consente di impostare un timeout personalizzato alle richieste web, evitando inutili attese

Classe ASP.NET C# per il controllo e il calcolo formale del Codice Fiscale

Oggi mi è toccato risolvere uno strano problema di timeout che si è verificato improvvisamente a una delle mie applicazioni Web ASP.NET: quando ho guardato i log, ho capito facilmente che il timeout era causato da una richiesta HTTP emessa da un’istanza della classe System.Net.WebClient che non riusciva a connettersi a un servizio web di terze parti, il quale risultava temporaneamente non disponibile.

Ecco l’errore generato dall’oggetto WebClient:

System.Net.Sockets.SocketException: Impossibile stabilire la connessione. Risposta non corretta della parte connessa dopo l’intervallo di tempo oppure mancata risposta dall’host collegato 216.239.38.21:443 (server ip address).

E questo è lo snippet di codice che lo generava:

Ovviamente la chiamata di cui sopra si trovava all’interno di un blocco try / catch, che impediva all’applicazione web di andare in errore; al tempo stesso, però, l’impossibilità di effettuare la connessione provocava un timeout non indifferente, pari al timeout predefinito della classe WebClient… ovvero, 100.000 millisecondi (!), senza peraltro alcun modo di cambiarlo (!!) visto che l’oggetto WebRequest sottostante utilizzato per effettuare la richiesta web viene creato on-the-fly e quindi non esposto (!!!).

Non male come situazione, vero? Fortunatamente, dopo una breve ricerca su Google, ho trovato un thread su StackOverflow che mi ha consentito di gestire la situazione nel migliore dei modi. Il risultato delle mie ricerche è riassumibile nella la seguente sottoclasse, che ho chiamato RyadelWebClient:

Come si può facilmente vedere guardando il codice e confrontandolo con la risposta accettata su StackOverflow, ho provato a modificare un pò il suggerimento iniziale così da avere una classe leggermente più versatile: in questo modo è possibile impostare un timeout alle richieste web sincrone e asincrone sia a partire dal costruttore che impostando una proprietà apposita. Visto che c’ero, ho anche colto l’occasione per abbassare il valore di Timeout predefinito a 30 secondi, visto che 100 mi sembrava a dir poco esagerato come default value.

ATTENZIONE: il codice sorgente riportato all’interno di questo articolo potrebbe non essere aggiornato: per essere certi di visualizzare l’ultima versione recatevi sulla  pagina GitHub del progetto.

Conclusioni

Per il momento è tutto: mi auguro che questa classe possa essere utile ad altri sviluppatori che si troveranno a dover risolvere problemi di timeout similari legati alla classe System.Net.WebClient.

Fork me on GitHub

About Ryan

IT Project Manager, Web Interface Architect e Lead Developer di numerosi siti e servizi web ad alto traffico in Italia e in Europa. Dal 2010 si occupa anche della progettazione di App e giochi per dispositivi Android, iOS e Mobile Phone per conto di numerose società italiane. Microsoft MVP for Development Technologies dal 2018.

View all posts by Ryan

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.