2012-08-26 1 views
1

Je suis nouveau aux services Web et je suis face à un problème de conception où nous voulons créer un service Web (de préférence SOAP base) qui recevra 2 paramètres:Est-il possible d'avoir plusieurs mappages xsd dans un webservice?

  • une chaîne variable (nom du client);
  • Données XML.

Il existe actuellement 2 utilisateurs différents de ce service Web, mais leur nombre augmentera. Tous les consommateurs ont des données XSD séparés qu'ils enverraient, par exemple:

Consumer1:

<ConData> 
    <Customer> 
     <FirstName>FirName</FirstName> 
     <LastName>LasName</LastName> 
    </Customer> 
    <Acocunt> 
     <Number>112971</Number> 
    </Account> 
    <Order> 
     <OrderNum>0092123</OrderNum> 
    </Order> 
<ConData> 

Consumer2:

<ConData> 
    <SysData> 
     <CustomerFirstName>Name</CustomerFirstName> 
     <CustomerLastName>Name</CustomerLastName> 
     <AccountNumber>Au1o2n</AccountNumber> 
     <OrderNum>koo912</OrderNum> 
    </SysData> 
<ConData> 

Ce service Web est censé prendre le XML données de ces clients et les stocker dans la base de données en fonction du nom du consommateur. Il n'y a pas de traitement requis de notre part pour valider le XML en tant que tel, nous le prenons simplement et le stockons dans la base de données.

Comme un bon design cependant, je voudrais définir mon service Web avec des paramètres explicites. Le problème est que, puisque leur format de données XML est différent, je ne suis pas en mesure d'utiliser un seul schéma XSD en tant que paramètre dans mon WSDL. Je peux penser à 2 options pour résoudre ce problème:

1. Laissez-les passer les données XML en tant que chaîne dans mon service Web au lieu du paramètre de mappage XSD. Bien que ce soit une approche valide, cela semble être un mauvais design basé sur ce que j'ai lu jusqu'ici sur les forums car il annule la validation et a besoin de beaucoup de marshaling manuel et d'unmarshaling et d'autres problèmes. De plus mon WSDL ne sera pas en mesure de définir à mes clients quel format devrait, etc.

2. Créer 2 services web distincts qui traiteront différents consommateurs avec leur propre de XSD. Cela semble encore moins viable puisque dans le futur si nous ajoutons plus de consommateurs nous devrons ajouter de nouveaux services Web avec le code dupliqué pour la même opération etc.

Je cherchais à voir s'il y a un moyen de définir plusieurs XSD dans un service Web unique WSDL ou peut-être une meilleure façon de résoudre ce problème. Sur une note de côté, je préférerais avoir un service Web basé sur SOAP mais si ce problème est résolu en utilisant un service web RESTful dans un meilleur sens, je peux aussi considérer cela.

Répondre

2

Vous n'avez pas besoin d'un service Web ou d'un squelette différent pour chaque client, vous avez juste besoin d'un WSDL différent. Oubliez l'envoi de ce paramètre XML sous forme de chaîne, il présente des inconvénients que je ne répéterai pas ici puisque vous en avez déjà pris connaissance. Vous devez donc l'envoyer en XML.

Pour le conserver dans un service Web, vous créez le service Web afin qu'il accepte tout XML en entrée (tapez <xsd:any> pour le paramètre). Type <xsd:any> signifiera n'importe quel type de XML, mais au moins ce serait XML que vous pouvez valider pour la structure, pour les débutants.Cela simplifie la gestion des versions de votre service Web car vous n'avez pas besoin de modifier le code lorsque vous ajoutez un autre type d'entrée XML. Malheureusement, vous perdez une forte typage pour votre service Web et le WSDL généré pour le service Web n'indique rien à propos de la structure du XML attendu (tout XML est trop vague). Votre squelette de service Web sera créé avec un type comme Object, XmlElement, XmlDocument ou n'importe quoi dans votre code. Et la même chose se produira avec tous vos talons de client.

Mais pour vos clients, cela peut être corrigé à partir du WSDL en fournissant à chaque client un WSDL différent. Pour cela, créez un fichier WSDL de votre service Web avec un contenu commun pour tous les clients, à l'exception de la section <types>, puis fusionnez ce fichier WSDL commun pour chaque client avec leur propre schéma XML. Vous allez ensuite exposer chaque WSDL sur différentes URL pour chaque client.

Maintenant, les clients seront en mesure de générer des bouts typés forts basés sur leur propre WSDL.

Lorsqu'un client appelle votre service Web, vous identifiez le schéma XML du client et l'utilisez pour valider le paramètre XML et voir s'il s'agit du contenu attendu.

Et si ce qui précède semble beaucoup, alors vous pouvez toujours choisir un service web RESTful typé lâche. Quelle que soit la solution que vous choisissez, assurez-vous simplement de valider le XML entrant en utilisant le schéma du client qui l'envoie.