Utiliser le débugger de Visual Studio côté client dans des classes partielles créées sur un proxy WCF

Dans le cadre d’une application utilisant un service WCF, il n’est pas rare de créer des classes partielles (partial class) côté client pour rajouter des propriétés aux objets envoyés par le service. Ces propriétés sont liées à l’application cliente (pour l’interface par exemple) et n’ont aucune raison d'être présentes côté service.

Par exemple une classe Produit avec les propriétés Prix, Nom, Stock définies côté service peut avoir une propriété IsVisible côté client permettant d’afficher ou non le produit sur l’interface graphique. Des méthodes peuvent également être créées dans ces classes partielles.

Exemple :

MyClass.cs (côté Service WCF) :

[DataContract]
public class MyClass
{
    [DataMember]
    public string Label { get; set; }
}

Partial_MyClass.cs (côté client) :

public partial class MyClass
{
    public bool IsVisible { get; set; }

    public void Display()
    {
        IsVisible = true;
    }
}

Dans la configuration par défaut de Visual Studio (Just My Code activé), les points d’arrêt (breakpoint) ne fonctionneront pas dans le code de ces classes. Avec la désactivation du “Just My Code” (Debug -> Options -> Enable Just My Code), les breakpoints fonctionneront mais ils vous sera toujours impossible de faire du StepOver (F10) ou du StepInto (F11).

La faute à l’attribut DebuggerStepTroughAttribute présent dans le fichier Reference.cs afin d'éviter au débugger de passer dans le fichier Reference.cs (proxy WCF côté client (généré par Visual Studio ou svcutil/slsvcutil), lors des StepOver (F10) et _StepInto _(F11) .

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute(
    "System.Runtime.Serialization", 
    "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(
    Name = "MyClass", 
    Namespace = "http://schemas.datacontract.org/2004/07/MyApp.Client.Web")]
public partial class MyClass : 
    object, System.ComponentModel.INotifyPropertyChanged
{

    private string LabelField;
    
    [System.Runtime.Serialization.DataMemberAttribute()]
    public string Label
    {
        get
        {
            return this.LabelField;
        }
        set
        {
            if ((object.ReferenceEquals(this.LabelField, value) != true))
            {
                this.LabelField = value;
                this.RaisePropertyChanged("Label");
            }
        }
    }
    
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    
    protected void RaisePropertyChanged(string propertyName)
    {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = 
            this.PropertyChanged;
        if ((propertyChanged != null))
        {
            propertyChanged(this, 
                new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}

Afin de débugguer simplement, éditer le fichier Reference.cs (généré par Visual Studio) et retirer l’attribut [System.Diagnostics.DebuggerStepThroughAttribute()] des classes qui vous intéressent.

Service Reference

Note : Demandez à Visual Studio d’afficher “Tous les fichiers” dans l’explorateur de solution et n’oubliez pas de répéter cette opération à chaque mise à jour de la service référence.

Merci à Gaël Covain pour son aide


Voir également