2009-09-21 13 views
7

.NETC# WCF Service with IXmlSerializable członka zamienia DataSet

Mam usługę internetową, jeden z członków danych komunikatu implementuje IXmlSerializable, kiedy ja „Dodaj usługi Reference”, że członek staje się DataSet.

Próbuję przekazać zserializowany Expression<TDelegate> jako parametr do usługi internetowej.

Q: W jaki sposób mogę dokonać DataSet Spośród instancji IXmlSerializable po stronie klienta?

Odpowiedz

4

Generalnie niestandardowa serializacja (przez IXmlSerializable) przez SOAP lub WCF jest złym pomysłem. Jeśli korzystasz z podzespołów współdziałających z WCF (tj. Zamiast generowania proxy, wysyłasz zestaw DTO do klienta), to może działać, ale nadal narusza SOA/mex itd. Właściwie to jestem zaskoczony, że to nie tylko da ci XmlElement lub coś podobnego, ale heh!

ja po prostu map istniejącego modelu (IXmlSerializable) obiektu do prostych typów, które można użyć standardowego serializacji (to znaczy nie IXmlSerializable).

BTW; czy spojrzałeś na usługi danych ADO.NET? To już obsługuje Expression przez przewód (chociaż nie jako wartość). Do przekazywania jako wartości, MetaLinq.

10

Zdaję sobie sprawę, że jest to starszy pytanie, ale dla przyszłych czytelników Oto co odkryłem:

Przedmioty, które implementują IXmlSerializable potrzebę posiadania schematu zdefiniowane, aby mogły pracować z WSDL, inaczej .Net framework nie wie, jak zdefiniować kontrakt, ponieważ serializacja jest niestandardowa.

Aby określić schemat, w którym nie powinno się używać metody GetSchema w interfejsie IXmlSerializowalnym, należy użyć atrybutu XmlSchemaProvider (msdn link). Więcej informacji na ten temat można znaleźć w artykule Microsoftu Enrich Your XML Serialization With Schema Providers In The .NET Framework w sekcji dostawców schematów.

Możesz znaleźć przykłady na stronie atrybutów XmlSchemaProvider oraz w artykule. Zalecam przechowywanie schematów w plikach .xsd i czytanie ich jak w przykładach. Zapis schematu za pomocą kodu jest w najlepszym wypadku uciążliwy.

Po zaimplementowaniu dostawcy schematu serializacja działała zgodnie z oczekiwaniami. Jeśli twoja usługa WCF jest hostowana w IIS, zapoznaj się z tym pytaniem, jak uzyskać właściwy katalog IIS poprzez odbicie Can I use reflection to find the bin/[Configuration] folder in ASP.NET instead of the asp temporary folder.

przykład z artykułu Microsoft:

[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; 
    } 

    ... 
}