IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Silverlight Discussion :

[SilverLight][WCF] Objet non modifier coté serveur après appel WCF


Sujet :

Silverlight

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Points : 48
    Points
    48
    Par défaut [SilverLight][WCF] Objet non modifier coté serveur après appel WCF
    Bonjour,

    Il arrive que lorsque j'envoie un objet en SilverLight via WCF, coté serveur les modifications de mon objet n'ont pas été prise en compte, pas pratique lorsque la méthode sert a faire un update...

    Alors, j'explique l'architecture de mon projet :
    - 1 bib de classe contenant des BO (Business Objects, classe représentant un enregistrement en base)
    - un projet contenant mon WCF avec des objets métiers qui peuvent contenir un BO + properties aux membres du BO.

    Lorsque je manipule mes objets métiers coté SilverLight pour le renvoyer au serveur et faire mon update, et bien jusqu'à la méthode Async(), j'ai le bon objet avec mes modifications. A la réception coté serveur, j'ai mon ancien objet, sans les modifications.
    Je ne comprends pas!

    Mon BO ressemble a ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class BO
    {
    	protected long m_lId;
    	protected string m_sNom;
     
    	public BO(){}
     
    	public BO(long in_lId, string in_sNom)
    	{
    		this.m_lId = in_lId;
    		this.m_sNom = in_sNom;
    	}
     
    	public long Id
    	{
    		get { return m_lId; }
    		set { m_lId = value; }
    	}
     
    	public string Nom
    	{
    		get { return m_sNom; }
    		set { m_sNom = value; }
    	}
    }
    mon objet métier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    [DataContract(IsReference = true)]
    public class MetierBO
    {
    	private BO m_objBO;
     
    	[DataMember]
    	public BO BusinessObject
    	{
    		get
    		{
    			return m_objBO;
    		}
     
    		private set { }
    	}
     
    	[DataMember]
    	public long Id
    	{
    		get
    		{
    			if(m_objBO != null)
    				return m_objBO.Id;
    			else
    				return -1;
    		}
    		private set
    		{
    			if(m_objExerciceBO != null)
    				m_objExerciceBO.Id = value;
    		}
    	}
     
    	[DataMember]
    	public string Nom
    	{
    		get
    		{
    			if(m_objBO != null)
    				return m_objBO.Nom;
    			else
    				return null;
    		}
    		private set
    		{
    			if(m_objExerciceBO != null)
    				m_objExerciceBO.Nom = value;
    		}
    	}
     
    	private MetierBO(BO in_objBO)
    	{
    		this.m_objBO = in_objBO;
    	}
    	//+ regles métier
    }
     
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Côté serveur, tu persistes bien les changements que tu fais en base (avec un SaveChanges par exemple) ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    mes méthodes de sauvegardes fonctionnent correctement!
    C'est juste, qu'à la première ligne de mon service, l'objet que je récupère du client n'est pas le même que l'objet retourné par le client!

    ex :
    Mon WCF me retourne une liste d’éléments dont l'un est MonObjet(isOK=false)
    Lorsque j'appelle la méthode d'update, j'envoie MonObjet(isOK=true) et côté serveur, je récupère MonObjet(isOK=false).
    Tout ça avec mon architecture ci dessus, où le BO de ma bibliothèque de classe est encapsulé par mon objet métier.

  4. #4
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Si tu regardes avec Fiddler l'envoi de ton BO à partir de Silverlight, est-ce que c'est la bonne version qui s'en va ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Je ne connais pas Fiddler!

    Est-ce bien cet outil?
    http://www.fiddler2.com/Fiddler2/version.asp

  6. #6
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par OminiuS Voir le message
    Je ne connais pas Fiddler!

    Est-ce bien cet outil?
    http://www.fiddler2.com/Fiddler2/version.asp
    Oui c'est ça.
    Ca sert de proxy http, il te permettra de voir toutes tes requêtes entre Silverlight et WCF par exemple (il y a une astuce pour le faire fonctionner sur localhost par contre).

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    ok, c'est pour ça que je ne capture rien!

    Quelle est cette astuce?

  8. #8
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par OminiuS Voir le message
    ok, c'est pour ça que je ne capture rien!

    Quelle est cette astuce?
    Soi tu remplaces localhost par ipv4.fiddler soit tu rajoutes un '.' derrière localhost (http://localhost.:55555/xxx.aspx)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    très intéressant comme outil!

    Lorsque j'envoie mon objet, il contient bien les bonne informations (coté client)!
    C'est coté serveur ou il ne contient plus les bonnes informations!

    Je ne comprends pas du tout...

    Concernant Fiddler, comment je peux filtrer sur les lien que je veux et pas sur mes pages internet

  10. #10
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par OminiuS Voir le message
    très intéressant comme outil!

    Lorsque j'envoie mon objet, il contient bien les bonne informations (coté client)!
    C'est quoi comme type de service que tu utilises ? WCF ou RIA ?
    Tu pourrais nous montrer ta méthode Update ?

    Concernant Fiddler, comment je peux filtrer sur les lien que je veux et pas sur mes pages internet
    Dans l'onglet Filter sur le panel à droite.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Je ne connais pas la différence entre WCF et RIA.
    Mais je pense que c'est du WCF.

    Voici mon contrat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [OperationContract]
    [FaultContract(typeof(ExceptionFault))]
    void UpdateExercice(Exercice in_objExercice);
    Voici la classe qui implemente mon contrat :
    A partir d'ici l'objet récupéré est mauvais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /// <summary>
    /// Mise a jour des informations d'un exercice en base de donnée
    /// </summary>
    /// <param name="in_objExercice">Exercice à mettre a jour</param>
    public void UpdateExercice(Exercice in_objExercice)
    {
    	Noyau.Singleton.UpdateExercice(in_objExercice);
    }
    voici le code du noyau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    internal void UpdateExercice(Exercice in_objExercice)
    {
    	try
    	{
    		// Trace de débogage d'entrée
    		Trace.WriteLine(string.Format(Resources.Debug_Noyau_UpdateExercice_Entree, in_objExercice), TypeTrace.Debug.ToString());
     
    		// update d'un exercice
    		GestionnaireDonneesSCIPIO.Singleton.UpdateExercice(in_objExercice);
    	}
    	catch(Exception e)
    	{
    		throw this.GenererFaultException(e);
    	}
    	finally
    	{
    		//Trace de débogage de sortie
    		Trace.WriteLine(string.Format(Resources.Debug_Noyau_UpdateExercice_Sortie, in_objExercice), TypeTrace.Debug.ToString());
    	}
    }
    Et voici le code de mon gestionnaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    internal void UpdateExercice(Exercice in_objExercice)
    {
    	// update d'un exercice
    	try
    	{
    		if(in_objExercice != null)
    		{
    			in_objExercice.Update();
     
    			//Mise à jour du dictionnaire des exercices
    			m_listExercices[in_objExercice.Nom] = in_objExercice;
    		}
    	}
    	catch(Exception e)
    	{
    		throw e;
    	}
    }
    merci

  12. #12
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Donc ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void UpdateExercice(Exercice in_objExercice)
    {
        Noyau.Singleton.UpdateExercice(in_objExercice);
    }
    in_objExercice est mauvais ?

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    oui, bizarre hein!?

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    J'ai refait des tests avec findler (J'ai un peu du mal avec l'outil...), en mettant une sessions sur le serveur.
    J'obtiens bien mon objet comme il faut dans l'inpector XML!
    Du coup, je ne pige pas pourquoi l'objet en débug est vide, il n'y a rien dedans!

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    http://stackoverflow.com/questions/2...s-from-service

    Dans ce lien, on explique qu'il faut mettre un DataContractAttribute.Namespace Property au DataContract.

    A quoi cela sert, qu'est ce qu'il faut que je mette exactement?

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    J'ai modifié ma classe pour éviter les références au BO par en exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    [DataContract(IsReference = true)]
    public class MetierBO
    {
    	private BO m_objBO;
    	private m_lId;
    	private m_sNom;
     
    	[DataMember]
    	public BO BusinessObject
    	{
    		get
    		{
    			return m_objBO;
    		}
     
    		private set { }
    	}
     
    	[DataMember]
    	public long Id
    	{
    		get
    		{
    			return m_lId;
    		}
    		private set
    		{
    			m_lId = value;
    		}
    	}
     
    	[DataMember]
    	public string Nom
    	{
    		get
    		{
    			return m_sNom;
    		}
    		private set
    		{
    			m_sNom = value;
    		}
    	}
     
    	private MetierBO(BO in_objBO)
    	{
    		this.m_objBO = in_objBO;
    		this.m_lId = m_objBO.Id;
    		this.m_sNom = m_objBO.Nom;
    	}
    	//+ regles métier
    }
    Côté SilverLight, j'ai une méthode qui charge ma liste de MetierBO.
    Je change les informations que je veux sauvegardé, je sauvegarde.
    Comme précédemment dans Fiddler, j'envoie bien mon objet complet.
    Et côté serveur, je ne reçois que les champs modifiés, le reste est vide!

    Le code côté client est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    this.ExerciceCourant.Avec3A = (bool)chk3A.IsChecked;
    this.ExerciceCourant.AvecMelmil = (bool)chkMELMIL.IsChecked;
    this.ExerciceCourant.AvecSIC = (bool)chkSic.IsChecked;
    this.ExerciceCourant.FrequencePointReprise = (int)FreqPointReprise.Value;
     
    UpdateExerciceRequest req = new UpdateExerciceRequest(this.ExerciceCourant);
    m_objServiceAdmin.UpdateExerciceAsync(req);

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    En continuant a faire des tests, je remarque qu'il n'y a que les champs que je modifie côté client qui apparaissent côté serveur, tous les autres champs sont a null!

    Merci de m'aider.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    ça était dur, mais j'ai finalement trouvé!

    Le précédent développeur avait mis les set de ses properties en private!
    Donc mes nouvelles properties contenaient bien mes infos, mais pas les anciennes!

    Un poids en moins...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Objets non modifiés.
    Par MickSou dans le forum Langage
    Réponses: 4
    Dernier message: 29/11/2012, 14h56
  2. Réponses: 2
    Dernier message: 25/08/2009, 17h46
  3. WebServices & reconstruction des objets coté serveur
    Par Nycos62 dans le forum Services Web
    Réponses: 1
    Dernier message: 02/04/2008, 14h54
  4. [WCF] Récupération de l'instance du service coté serveur
    Par pc152 dans le forum Windows Communication Foundation
    Réponses: 2
    Dernier message: 20/06/2007, 12h06
  5. [POO] balise ou objet non reconnu lors d'un deploiement serveur
    Par benssj5 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 02/01/2006, 18h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo