Archive

Archive for the ‘Astuces’ Category

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 :).

Catégories :.Net, Astuces

Astuce : [WCF] Exposer son service WCF sous IIS sans passer par la directive ServiceHost

Lorsqu’on veut héberger son service WCF sous IIS nous utilisons la plupart du temps le template de fichier sous Visual Studio portant l’extension *.svc. Dans ce template nous devons effectuer un certain nombre de paramétrages pour que IIS puisse héberger le service et l’activer lors de la réception de la première requête client en utilisant la directive ServiceHost comme dans l’exemple ci-dessous :

<%@ ServiceHost Language= »C# » Debug= »true »  Service= »WebApplicationTest.MyService » CodeBehind= »MyService.svc.cs » %>

Une nouveauté venue avec la sortie de WCF 4.0 permet de ne pas utiliser le fichier template *.svc et par conséquent de ne pas utiliser la directive ServiceHost, mais de tout paramétrer via le fichier de configuration web.config comme suit :

<system.serviceModel>
  <serviceHostingEnvironment>
    <serviceActivations>
      <add service="WebApplicationTest.MyService" relativeAddress="MyService.svc" />
    </serviceActivations>
  </serviceHostingEnvironment>
</system.serviceModel>

Dans l’exemple ci-dessus, nous venons d’héberger notre service MyService sans passer par la directive ServiceHost du traditionnel fichier *.svc. Les seules choses dont il faut faire attention lors de la configuration sont :

  1. la présence de l’espace de noms de notre service dans l’attribut service.
  2. la présence obligatoire de l’extension .svc dans la valeur de l’attribut relativeAddress

Notez que vous pouvez aussi configurer le factory à utiliser via l’attribut factory.

Catégories :Astuces, WCF Étiquettes :
%d blogueurs aiment cette page :