2009-09-21 13 views
7

.NETC#: WCF-Dienst mit IXmlSerializable Mitglied verwandelt sich in DataSet

ich einen Web-Service haben, eines der Datenelemente einer Nachricht implementiert IXmlSerializable, wenn ich „Dienstverweis hinzufügen“ dieses Mitglied ein DataSet wird.

Ich versuche, eine serialisierte Expression<TDelegate> als Parameter an den Web-Service zu übergeben.

Q: Wie mache ich ein DataSet aus der IXmlSerializable Instanz auf der Client-Seite?

Antwort

4

Im Allgemeinen ist benutzerdefinierte Serialisierung (über IXmlSerializable) über entweder SOAP oder WCF eine schlechte Idee. Wenn Sie Assembly-Sharing mit WCF verwenden (dh statt Proxy-Generierung, versenden Sie die DTO-Assembly an den Client), dann kann es funktionieren, aber es verletzt immer noch SOA/Mex usw. Eigentlich bin ich überrascht, dass es nicht nur geben Sie XmlElement oder ähnliches, aber heh!

Ich würde einfach Karte Ihr vorhandenes (IXmlSerializable) Objektmodell in einfachen-Typen, die die Standard-Serialisierung verwenden können (das heißt keine IXmlSerializable).

BTW; Haben Sie sich ADO.NET Data Services angesehen? Dies behandelt bereits Expression über die Leitung (wenn auch nicht als Wert). Zum Übergeben als Werte, MetaLinq.

10

Ich weiß, dies ist eine ältere Frage, aber für zukünftige Leser hier ist das, was ich entdeckt:

Objekte, die IXmlSerializable Bedarf implementieren ein Schema definiert, um zu haben, um sie mit der WSDL-Datei zu arbeiten, da sonst die .Net Framework weiß nicht, wie der Vertrag definiert wird, da die Serialisierung benutzerdefiniert ist.

Verwenden Sie das XmlSchemaProvider-Attribut (msdn link), um das Schema anzugeben, das Sie die GetSchema-Methode in der IXmlSerializable-Schnittstelle nicht verwenden sollen. Sie können mehr in Microsofts Artikel Enrich Your XML Serialization With Schema Providers In The .NET Framework im Schema Provider Abschnitt lesen.

Sie finden Beispiele auf der XmlSchemaProvider-Attributseite und dem Artikel. Ich empfehle, Ihre Schemas in XSD-Dateien zu speichern und sie wie in den Beispielen zu lesen. Das Schreiben des Schemas durch Code ist bestenfalls beschwerlich.

Sobald ich den Schema-Provider implementiert hatte, funktionierte die Serialisierung wie erwartet. Wenn Ihr WCF-Dienst IIS-Gehostet ist, lesen Sie diese Frage zum richtigen IIS-Verzeichnis mithilfe der Reflektion Can I use reflection to find the bin/[Configuration] folder in ASP.NET instead of the asp temporary folder.

Beispiel aus dem Microsoft-Artikel:

[XmlRoot(ElementName="product_root", DataType="product_type", 
    Namespace="http://SchemaProvider.Example.org/Product.xsd", 
    IsNullable = false)] 
[XmlSchemaProviderAttribute("GetSchemaFile")] 
public class Product : IXmlSerializable 
{ 
    public static XmlSchemaComplexType GetSchemaFile(
     System.Xml.Schema.XmlSchemaSet xs) 
    { 
     string xsdFile = Directory.GetCurrentDirectory() + 
      "\\Product.xsd"; 
     XmlSerializer schemaSerializer = 
      new XmlSerializer(typeof(XmlSchema)); 
     XmlSchema schema = 
      (XmlSchema)schemaSerializer.Deserialize(
       XmlReader.Create(xsdFile)); 
     xs.Add(schema); 

     // target namespace 
     string tns = "http://SchemaProvider.Example.org/Product.xsd"; 
     XmlQualifiedName name = 
      new XmlQualifiedName("product_type", tns); 
     XmlSchemaComplexType productType = 
      (XmlSchemaComplexType) schema.SchemaTypes[name]; 

     return productType; 
    } 

    ... 
}