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