Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

Utiliser l’attribut XmlSchemaProvider

Récemment j’ai eu besoin de retourner un objet non serializable via un WebService. Afin de réaliser cela, j’ai implémenté l’interface IXmlSerializable.

Prenons par exemple ce service :

[ServiceContract] public interface IMyService { [OperationContract] Person Get(int personId); } [DataContract] public class Person : IXmlSerializable { // ... public void WriteXml(XmlWriter writer) { writer.WriteStartDocument(); writer.WriteStartElement("Person", "http://schemas.itelios.com/sample/Person"); writer.WriteAttributeString("PersonID", this._personId.ToString()); writer.WriteElementString("FirstName", this._firstName); writer.WriteEndElement(); } }

Si l’on rajoute une référence à ce service et que l’on ne partage pas le type Person alors le type de retour sera DataSet !

image

Si l’on regarde le WSDL (WebService Description Language) c’est à dire la description du service, alors on voit ceci :

<xs:complexType name="Person"> <xs:sequence> <xs:element ref="xs:schema" /> <xs:any /> </xs:sequence> </xs:complexType>

L’élément xs:any indique que le noeud que l’on retourne peut contenir n’importe quel élément XML.

Ce comportement est normal, nous spécifions nulle part le schéma du XML que l’on retourne. Avant de spécifier un schéma nous allons créer le type XSD que l’on va retourner :

<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://schemas.itelios.com/sample/Person" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="Person"> <xs:sequence> <xs:element name="FirstName" type="xs:string" /> </xs:sequence> <xs:attribute name="PersonID" type="xs:int" use="required" /> </xs:complexType> </xs:schema>

Puis, utilisons l’attribut XmlSchemaProviderAttribute, cet attribut prend en paramètre le nom d’une méthode static devant avoir la signature suivante :

public static XmlQualifiedName XXX(XmlSchemaSet xss)

L’objet de type XmlSchemaSet est la collection de schema associée à notre WebService, nous allons rajouter notre schema dans cette collection. Il reste alors à indiquer quel type XSD notre objet va retourner, c’est le but du XmlQualifiedName.

public class Person { // ... public static XmlQualifiedName GetPersonSchema(XmlSchemaSet xss) { // on stock notre fichier XSD en ressource de notre assembly using (Stream fs = Assembly.GetExecutingAssembly() .GetManifestResourceStream("Contract.Person.xsd")) { XmlSchema schema = XmlSchema.Read(fs, (sender, e) => { Console.WriteLine(e.Message); }); xss.Add(schema); } // nom du type XSD et namespace de l'objet que notre serialization va utiliser return new XmlQualifiedName("Person", @"http://schemas.itelios.com/sample/Person"); } }
Ainsi, notre schéma sera correctement ajouté au niveau du WSDL et le type retourné sera associé avec le type Person du namespace spécifié.

image

Cet attribut fonctionne aussi bien pour les services WCF que pour les services web classique (asmx).

Pour information, j’ai déjà expliqué comment utiliser l’interface IXmlSerializable ici : WCF : serialiser un objet non serialisable lorsque l'on n'a pas accès au type

Posted: lundi 31 août 2009 00:32 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01

- SharePoint Online: Script PowerShell pour supprimer une colonne dans tous les sites d’une collection par Blog Technique de Romelard Fabrice le 11-27-2018, 18:01