Accueil > .Net, Astuces > ExtendedWebClient : une extension de la classe WebClient

ExtendedWebClient : une extension de la classe WebClient

[EDIT]

La méthode Abort ajoutée précédemment ne sert pas à grand chose 😀 Apparemment je suis passé à côté de l’existence de la méthode CancelAsync.

Récemment j’ai voulu augmenter le Timeout d’exécution des méthodes (téléchargement et téléversement) de la classe WebClient. Ce besoin est venu du fait que je travaillais avec une requête qui prenait pas de mal de temps parce que le serveur devait effectuer différentes tâches qui prenaient pas mal de temps or la classe WebClient telle que définie n’expose pas et donc ne permet la modification de la propriété Timeout alors qu’elle utilise bien en interne un objet de Type WebRequest qui lui expose une propriété Timeout qui peut être modifiée.

J’ai trouvé une solution à ce problème en créant une classe ExtendedWebClient qui dérive de la classe de base WebClient et par la suite j’ai redéfini la méthode GetWebRequest (qui est chargée de créer l’objet WebRequest qui sera utilisé par la suite par notre WebClient). Dans la redéfinition j’attribue la valeur de mon Timeout à la propriété Timeout de l’instance WebRequest créée . Voilà.

Suite à cette discussion postée ici, j’ai par la suite ajouté une propriété CookieContainer pour de la gestion des cookies (uniquement pour les requêtes HTTP/S).

Ci-dessous le code complet de classe ExtendedWebClient :

/// <summary>
/// Classe dérivée de la classe WebClient
/// </summary>
public class ExtendedWebClient : WebClient
{
    #region Fields

    private WebRequest request;

    #endregion // Fields

    #region Properties

    /// <summary>
    /// Obtient la durée du timeout
    /// </summary>
    public int Timeout { get; private set; }

    /// <summary>
    /// Obtient le container de cookies
    /// </summary>
    public CookieContainer CookieContainer { get; private set; }

    #endregion // Properties

    #region  Consctuctors

    /// <summary>
    /// Constructeur de la classe ExtendedWebClient
    /// </summary>
    /// <param name="timeout">Durée en millisecondes </param>
    public ExtendedWebClient(int timeout)
    {
        this.Timeout = timeout;
        this.CookieContainer = new CookieContainer();
    }

    #endregion // Constructors

    #region Overriden methods

    protected override WebRequest GetWebRequest(Uri address)
    {
        this.request = base.GetWebRequest(address);

        // S'il s'agit d'une instance de type HttpWebRequest alors on instancie le container de cookie
        if (this.request is HttpWebRequest)
        {
            (this.request as HttpWebRequest).CookieContainer = this.CookieContainer;
        }

        // Si this.Timeout <= 0 alors la valeur par défaut qui sera utilisée.
        this.request.Timeout = this.Timeout <= 0 ? this.request.Timeout : this.Timeout;
        return this.request;
    }

    #endregion // Overriden methods
}

J’espère que cette classe vous sera utilse :).

Publicités
Catégories :.Net, Astuces
  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :