OVH Cloud OVH Cloud

arguement Webmethod

6 réponses
Avatar
Stephane
Bonjour,

Je développe actuellement un webservice dont une webmethod prend en
argument un objet initialiser coté serveur (initialisation fonction du
web.config). Pour ce faire, le client du webservice appelle une seconde
webmethod qui renvoie cet object initialisé. Le client peut ensuite le
modifier et l'utiliser pour appeler la webmethod initiale.

Mon problème est que toutes les modifications effectuées par le client
sur l'objet sont perdues lors de l'appel de la webmethod initiale.
Celui-ci est toujours reçu avec ses valeurs par défaut.

Savez-vous d'où cela peut venir ? Ma classe ne contient qu'un
constructeur (le constructeur par défaut) qui va extraire du web.config
les éléments nécessaires à son initialisation... Cela a-t-il un lien ?

Merci d'avance
Stéphane

6 réponses

Avatar
Delf
Stephane wrote:

Mon problème est que toutes les modifications effectuées par le
client sur l'objet sont perdues lors de l'appel de la webmethod
initiale. Celui-ci est toujours reçu avec ses valeurs par défaut.



Si je comprends bien, tu dois ajouter l'attribut :

[EnableSession=true] à ta WebMéthode pour permettre l'état de session
pour les utilisateurs (cf. MSDN).

--
Delf
Avatar
Delf
Stephane wrote:

[...]



Exemple à l'arrache (et non testé :p)

[WebMethod(EnableSession=true)]
public void Initialization()
{
int iValue Convert.ToInt32(
System.Configuration.ConfigurationManager.AppSettings["WebConfigValue"]);

Session["Value"] = iValue;
}

[WebMethod(EnableSession=true)]
public int IncrementAndReturn()
{
// if (Session["Value"] == null) ...

int newValue = (int)Session["Value"] + 1;

Session["Value"] = newValue;

return newValue ;
}

Ca fonctionne ?

--
Delf
Avatar
Stephane
Merci pour ces indications mais cela ne change rien... L'objet envoyé
par le client à la webmethod n'est toujours pas celui reçu par le
webservice.

ex :
Le client appelle la web method initobjetA qui lui renvoie une instance
de l'objet A dont la propriété nom vaut "" (valeur par défaut).
Le client modifie la propriété nom de l'objet A et lui associe "Moi".
Le client appelle la webmethod obtenirinfo en lui passant comme argument
l'objet A modifié
La webmethod s'exécute comme si elle avait reçu un objet où la propriété
nom vaut "", sa valeur par défaut ????

Je ne comprends pas ce fonctionnement... Avez-vous d'autres pistes à me
fournir

Merci


Delf a écrit :
Stephane wrote:

Mon problème est que toutes les modifications effectuées par le
client sur l'objet sont perdues lors de l'appel de la webmethod
initiale. Celui-ci est toujours reçu avec ses valeurs par défaut.




Si je comprends bien, tu dois ajouter l'attribut :

[EnableSession=true] à ta WebMéthode pour permettre l'état de session
pour les utilisateurs (cf. MSDN).



Avatar
Stephane
Je pense mettre mal exprimé... Je ne pense pas avoir besoin de variables
de session car toutes les modifications de l'objet sont effectuées par
le client en local

Voici l'architecture des deux webmethods concernées :

[WebMethod(Description="Retourne ...")]
[XmlInclude(typeof(Extraction))]
public Extraction ObtenirChampsExtraction () {
return new Extraction();
}


[WebMethod(Description="Retourne ...")]
[XmlInclude(typeof(Extraction))]
public object[] ObtenirExtraction (System.String base, Extraction
liste_extraction, out System.Int32 nblignes, out System.Int32 code_retour){
if (liste_extraction.Nom != "TOUS") {
...
}
else {
...
}
return resultat;
}


Le client modifie, en local, les propriétés de l'objet retourné par la
ObtenirChampsExtraction et transmet cet objet à la webmethod
ObtenirExtraction qui extrait les données recherchées par le client

L'objet reçu par la webmethod ObtenirExtraction ne tient pas compte des
modifications du client. L'objet possède en permanence ses valeurs par
défaut.

Merci encore pour votre aide
Stéphane

Delf a écrit :
Stephane wrote:

[...]




Exemple à l'arrache (et non testé :p)

[WebMethod(EnableSession=true)]
public void Initialization()
{
int iValue > Convert.ToInt32(
System.Configuration.ConfigurationManager.AppSettings["WebConfigValue"]);

Session["Value"] = iValue;
}

[WebMethod(EnableSession=true)]
public int IncrementAndReturn()
{
// if (Session["Value"] == null) ...

int newValue = (int)Session["Value"] + 1;

Session["Value"] = newValue;

return newValue ;
}

Ca fonctionne ?



Avatar
Delf
Stephane wrote:

Je ne comprends pas ce fonctionnement... Avez-vous d'autres pistes à me
fournir



Peux-tu nous poster le code stp ?

--
Delf
Avatar
Stephane
Je viens de comprendre pourquoi mon objet conserve ses valeurs par
défauts : ses propriétés sont définies via un get et un set et la partie
set est vide (je voulais des propriétés en lectures seule mais celles-ci
ne sont pas sérialisées d'où le set{}). Lors du passage d'argument, les
nouvelles valeurs étaient bien transmises mais je ne les traitais pas.
C'est maintenant chose faite !

Merci beaucoup pour votre aide
Bonne soirée


Delf a écrit :
Stephane wrote:

Je ne comprends pas ce fonctionnement... Avez-vous d'autres pistes à
me fournir




Peux-tu nous poster le code stp ?