[.NET] WebService : Comment les exploiter convenablement

WebService : Comment les exploiter convenablement [.NET] - C#/.NET managed - Programmation

Marsh Posté le 26-04-2006 à 19:14:59    

Salut,
 
Je reviens à la charge à propos des WebServices.
 
Plateforme :
Serveur de base de données Oracle 8i hébergé sur Windows 2000 Server (d'ici deux mois, 10g sous Windows 2003 Server)
WebService hébergé sur un serveur Windows 2003 Server, écrit en C# .NET 2.0
Application cliente tournant sur Windows 2000 Pro/XP Pro, écrite en C# .NET 2.0
 
Architecture :
Je suis en train d'écrire une application Windows, qui attaque une base de données qui doit rester inaccessible aux utilisateurs. Mais l'appli doit être utilisable de n'importe où, y compris depuis Internet.
J'ai donc choisi d'utiliser des WebServices simples découpés en métiers afin d'interroger la base depuis mon appli.
Pour le moment, j'ai deux WebServices :
- Agent : Permet à l'utilisateur de s'authentifier et de charger son profile dans l'application
- Customer : Permet d'interroger la base de données à propos des clients et la mettre à jours depuis l'application
 
Problèmes :
Premier problème. (En fait, je viens de me rendre compte qu'un autre bug faisait planter... Il ne doit pas y avoir de problème, mais on ne sait jamais...)
J'ai une méthode :

Code :
  1. [WebMethod]
  2. public string LoadCustomer(decimal codsoc, string sigtie)
  3. {
  4.    ...
  5. }


Appel :

Code :
  1. string ret = MonService.LoadCustomer(2, "toto" );


Est-ce que ça marche ? J'ai obtenu pendant une heure une erreur de cast, et j'ai changé le "codsoc" en "string", puis fait un "decimal.Parse()" dans la méthode. Mais je me suis rendu compte que j'avais aussi un problème de cast dans la méthode plus loin, et du coup j'ai pas retesté... (putain que c'est relou cette histoire de debuger qui marche pas :gun:)
 
Second problème (celui-là, c'est un vrai)
Vous vous en doutez, un client, c'est loin d'être une simple string. Pour le moment, je recopie le résultat de mon "DataReader" dans un document "XmlDocument", et je retourne un "dom.InnerXml". Depuis l'appli, je fais alors un "dom.LoadXml(ret)". Ca marche, mais je trouve ça un peu lourd pour pas grand chose.
Est-ce qu'il n'y a pas moyen par exemple de retourner un "struct", qui serait alors aisément encodable par le WebService en Xml, que je pourrais alors recharger simplement ? Même si au final, c'est le même flux qui circule entre les deux, ce serait plus propre... Ou tout autre moyen ?
 
Merci !

Reply

Marsh Posté le 26-04-2006 à 19:14:59   

Reply

Marsh Posté le 26-04-2006 à 20:22:28    

Les dataset de .NET c'est vraiment bien. Faut pas t'en priver ça marche très bien. Par contre, n'essaye pas une datatable seule. ça ne marchera pas, mais le dataset ça fonctionne nikel... Ton exemple doit fonctionner normalement. Franchement les Web Services .NET il n'y a rien de plus facile quan dje vois les Web Services JAVA offre bcp moins de flexibilité quand même...

Reply

Marsh Posté le 26-04-2006 à 22:52:53    

le dataset semble etre la structure qui te conviendrait le mieux. J'utilise aussi des hashtables.
Par contre, le pb recurent est que je garde toujours une colonne pour gerer un code d'erreur. genre si le webservice a reussi a faire ce que je demandais, si j'ai reelement des données, tout ca pour eviter de caster des nulls ou des trucs du genre.

Reply

Marsh Posté le 27-04-2006 à 09:34:40    

:??: tu peux faire un return d'un dataset dans un webservice ?

Reply

Marsh Posté le 27-04-2006 à 10:29:49    

Ah ben en effet, en mettant des DataSet, ça fait vachement de lignes en moins :o

Reply

Marsh Posté le 27-04-2006 à 13:03:19    

Arjuna a écrit :

Ah ben en effet, en mettant des DataSet, ça fait vachement de lignes en moins :o


;)
par contre, tu ne peux pas remonter de datatables directement car pas serializable :). Il y avait un article de la kb Microsoft a ce sujet, mais je l'ai pas sous la main. si je le retrouve, je t'envoie
l'autre interet de ton dataset est qu'il est "representable" en xml, tu le vois si tu appelles ton webservice via IE  
 
edit : on comprend alors la portabilité inter langage, car si en .net tu peux caster directement en dataset, tu peux aussi bien le caster en domdocument dans un autre langage !


Message édité par alien_nan le 27-04-2006 à 13:06:04
Reply

Marsh Posté le 27-04-2006 à 16:47:09    

ben en fait, c'est ce qu'il se passe : le webservice retourne de toute façon un flux xml. le ds est encodé en xml, avec une propriété en amont que .NET reconnait afin de comprendre qu'il sait d'un ds. de la même façon, en Java ou autre, on peut retourner un flux compatible dataset de .NET si on s'y prends bien.
 
en fait, ils ont automatisé ce que j'avais fait à la main (recopie de mes données dans un dom, retour d'un string représentant mon dom, puis loadxml du résultat :)
 
sinon, c'est même mieu qu'on ne puisse pas faire de dt, mais des ds. parcequ'un ds contiens des dt, et du coup je peux retourner le résultat de plusieurs requêtes d'un coup, et les identifier par un tablename différent dans mon ds :) et en plus ça marche :bounce:

Reply

Marsh Posté le 28-04-2006 à 13:00:05    

convernant la création d'un objet JAVA compatible avec .NET laisse tombé. J'ai essayé, à moins de lui fournir un document xml directement, il n'y a pas moyen et c'est vraiment chiant. Quand on voit la sérialisation d'un dataset, c'est full propriétaire. Donc pour construire un ensemble de liste coté java pour que ce soit compatible avec .NET :s laisse tomber... :s

Reply

Marsh Posté le 28-04-2006 à 15:39:51    

Ben ça va, moi je trouve ça plutôt lisible ce que génère un DS...
T'as le XSD suivit des données formattées selon ce XSL, c'est pas bien compliqué à automatiser pour relire la chose :

Code :
  1. <?xml version="1.0" standalone="yes"?>
  2. <tie>
  3.   <xs:schema id="tie" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  4.     <xs:element name="tie" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
  5.       <xs:complexType>
  6.         <xs:choice minOccurs="0" maxOccurs="unbounded">
  7.           <xs:element name="alerte1">
  8.             <xs:complexType>
  9.               <xs:sequence>
  10.                 <xs:element name="SIGTIE" type="xs:string" minOccurs="0" />
  11.                 <xs:element name="NOMTIE" type="xs:string" minOccurs="0" />
  12.                 <xs:element name="LOCALI" type="xs:string" minOccurs="0" />
  13.                 <xs:element name="CODPOS" type="xs:string" minOccurs="0" />
  14.                 <xs:element name="DATSIG1" type="xs:string" minOccurs="0" />
  15.                 <xs:element name="DATSIG2" type="xs:string" minOccurs="0" />
  16.                 <xs:element name="DATVIG" type="xs:string" minOccurs="0" />
  17.                 <xs:element name="ECHEANCE1" type="xs:string" minOccurs="0" />
  18.                 <xs:element name="ECHEANCE2" type="xs:string" minOccurs="0" />
  19.                 <xs:element name="PREAVIS" type="xs:decimal" minOccurs="0" />
  20.                 <xs:element name="DATPREAVIS1" type="xs:string" minOccurs="0" />
  21.                 <xs:element name="DATPREAVIS2" type="xs:string" minOccurs="0" />
  22.                 <xs:element name="DUREE" type="xs:decimal" minOccurs="0" />
  23.                 <xs:element name="OBSERVATIONS" type="xs:string" minOccurs="0" />
  24.                 <xs:element name="RETOUR" type="xs:string" minOccurs="0" />
  25.                 <xs:element name="RETDIP" type="xs:string" minOccurs="0" />
  26.                 <xs:element name="DATENVDIP" type="xs:string" minOccurs="0" />
  27.                 <xs:element name="DATENVCNT" type="xs:string" minOccurs="0" />
  28.               </xs:sequence>
  29.             </xs:complexType>
  30.           </xs:element>
  31.           <xs:element name="alerte2">
  32.             <xs:complexType>
  33.               <xs:sequence>
  34.                 <xs:element name="SIGTIE" type="xs:string" minOccurs="0" />
  35.                 <xs:element name="NOMTIE" type="xs:string" minOccurs="0" />
  36.                 <xs:element name="LOCALI" type="xs:string" minOccurs="0" />
  37.                 <xs:element name="CODPOS" type="xs:string" minOccurs="0" />
  38.                 <xs:element name="DATSIG1" type="xs:string" minOccurs="0" />
  39.                 <xs:element name="DATSIG2" type="xs:string" minOccurs="0" />
  40.                 <xs:element name="DATVIG" type="xs:string" minOccurs="0" />
  41.                 <xs:element name="ECHEANCE1" type="xs:string" minOccurs="0" />
  42.                 <xs:element name="ECHEANCE2" type="xs:string" minOccurs="0" />
  43.                 <xs:element name="PREAVIS" type="xs:decimal" minOccurs="0" />
  44.                 <xs:element name="DATPREAVIS1" type="xs:string" minOccurs="0" />
  45.                 <xs:element name="DATPREAVIS2" type="xs:string" minOccurs="0" />
  46.                 <xs:element name="DUREE" type="xs:decimal" minOccurs="0" />
  47.                 <xs:element name="OBSERVATIONS" type="xs:string" minOccurs="0" />
  48.                 <xs:element name="RETOUR" type="xs:string" minOccurs="0" />
  49.                 <xs:element name="RETDIP" type="xs:string" minOccurs="0" />
  50.                 <xs:element name="DATENVDIP" type="xs:string" minOccurs="0" />
  51.                 <xs:element name="DATENVCNT" type="xs:string" minOccurs="0" />
  52.               </xs:sequence>
  53.             </xs:complexType>
  54.           </xs:element>
  55.           <xs:element name="alerte3">
  56.             <xs:complexType>
  57.               <xs:sequence>
  58.                 <xs:element name="SIGTIE" type="xs:string" minOccurs="0" />
  59.                 <xs:element name="NOMTIE" type="xs:string" minOccurs="0" />
  60.                 <xs:element name="LOCALI" type="xs:string" minOccurs="0" />
  61.                 <xs:element name="CODPOS" type="xs:string" minOccurs="0" />
  62.                 <xs:element name="DATSIG1" type="xs:string" minOccurs="0" />
  63.                 <xs:element name="DATSIG2" type="xs:string" minOccurs="0" />
  64.                 <xs:element name="DATVIG" type="xs:string" minOccurs="0" />
  65.                 <xs:element name="ECHEANCE1" type="xs:string" minOccurs="0" />
  66.                 <xs:element name="ECHEANCE2" type="xs:string" minOccurs="0" />
  67.                 <xs:element name="PREAVIS" type="xs:decimal" minOccurs="0" />
  68.                 <xs:element name="DATPREAVIS1" type="xs:string" minOccurs="0" />
  69.                 <xs:element name="DATPREAVIS2" type="xs:string" minOccurs="0" />
  70.                 <xs:element name="DUREE" type="xs:decimal" minOccurs="0" />
  71.                 <xs:element name="OBSERVATIONS" type="xs:string" minOccurs="0" />
  72.                 <xs:element name="RETOUR" type="xs:string" minOccurs="0" />
  73.                 <xs:element name="RETDIP" type="xs:string" minOccurs="0" />
  74.                 <xs:element name="DATENVDIP" type="xs:string" minOccurs="0" />
  75.                 <xs:element name="DATENVCNT" type="xs:string" minOccurs="0" />
  76.               </xs:sequence>
  77.             </xs:complexType>
  78.           </xs:element>
  79.         </xs:choice>
  80.       </xs:complexType>
  81.     </xs:element>
  82.   </xs:schema>
  83.   <alerte1>
  84.     <SIGTIE>AGEN</SIGTIE>
  85.     <NOMTIE>BERNIMA B&amp;C</NOMTIE>
  86.     <LOCALI>AGEN</LOCALI>
  87.     <CODPOS>47000</CODPOS>
  88.     <DATSIG1 xml:space="preserve"> </DATSIG1>
  89.     <DATSIG2 xml:space="preserve"> </DATSIG2>
  90.     <DATVIG xml:space="preserve"> </DATVIG>
  91.     <ECHEANCE1 xml:space="preserve"> </ECHEANCE1>
  92.     <ECHEANCE2 xml:space="preserve"> </ECHEANCE2>
  93.     <PREAVIS>0</PREAVIS>
  94.     <DATPREAVIS1 xml:space="preserve"> </DATPREAVIS1>
  95.     <DATPREAVIS2 xml:space="preserve"> </DATPREAVIS2>
  96.     <DUREE>0</DUREE>
  97.     <OBSERVATIONS xml:space="preserve"> </OBSERVATIONS>
  98.     <RETOUR>N</RETOUR>
  99.     <RETDIP>N</RETDIP>
  100.     <DATENVDIP xml:space="preserve"> </DATENVDIP>
  101.     <DATENVCNT xml:space="preserve"> </DATENVCNT>
  102.   </alerte1>
  103.   <alerte1>
  104.     <SIGTIE>ALBA</SIGTIE>
  105.     <NOMTIE>TRANSPORTS ALBA</NOMTIE>
  106.     <LOCALI>BRESSOLS</LOCALI>
  107.     <CODPOS>82710</CODPOS>
  108.     <DATSIG1 xml:space="preserve"> </DATSIG1>
  109.     <DATSIG2 xml:space="preserve"> </DATSIG2>
  110.     <DATVIG xml:space="preserve"> </DATVIG>
  111.     <ECHEANCE1 xml:space="preserve"> </ECHEANCE1>
  112.     <ECHEANCE2 xml:space="preserve"> </ECHEANCE2>
  113.     <PREAVIS>0</PREAVIS>
  114.     <DATPREAVIS1 xml:space="preserve"> </DATPREAVIS1>
  115.     <DATPREAVIS2 xml:space="preserve"> </DATPREAVIS2>
  116.     <DUREE>0</DUREE>
  117.     <OBSERVATIONS xml:space="preserve"> </OBSERVATIONS>
  118.     <RETOUR>N</RETOUR>
  119.     <RETDIP>N</RETDIP>
  120.     <DATENVDIP xml:space="preserve"> </DATENVDIP>
  121.     <DATENVCNT xml:space="preserve"> </DATENVCNT>
  122.   </alerte1>
  123. </tie>


Message édité par Arjuna le 28-04-2006 à 15:41:15
Reply

Marsh Posté le 29-04-2006 à 10:19:42    

je ne dis pas que son xml est compliqué à comprendre. Mais plutot compliqué à généré sans passer par de l'xml pure en JAVA par exemple. Rien qu'au niveau des namespaces c'est déjà le bordel pour concevoir un objet non xml en JAVA compatible avec le DS.

Reply

Marsh Posté le 29-04-2006 à 10:19:42   

Reply

Marsh Posté le 29-04-2006 à 10:59:42    

ha ben ouais, mais après si java ils sont pas foutus d'avoir un objet avec une méthode "loadxml" qui pourrait reprendre ton xml modifié, forcément tu vas pas pouvoir t'en servir. mais à ce moment, c'est plutôt java qui pèche. .NET offre le saveXml et loadXml, à java de faire pareil en face :spamafote:

Reply

Marsh Posté le 29-04-2006 à 11:07:00    

si les deux arrivait à se foutre d'accord, ça m'arrangerait bcp :D

Reply

Marsh Posté le 02-05-2006 à 10:42:23    

c'est sûr :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed