.NETC#:WCF服務與IXmlSerializable的成員變成數據集
我有一個Web服務,實現IXmlSerializable的消息的數據成員之一,當我做「添加服務引用」該成員將成爲一個DataSet。
我正在嘗試將序列號Expression<TDelegate>
作爲參數傳遞給Web服務。
問:我如何做一個DataSet
出在客戶端的IXmlSerializable
實例?
.NETC#:WCF服務與IXmlSerializable的成員變成數據集
我有一個Web服務,實現IXmlSerializable的消息的數據成員之一,當我做「添加服務引用」該成員將成爲一個DataSet。
我正在嘗試將序列號Expression<TDelegate>
作爲參數傳遞給Web服務。
問:我如何做一個DataSet
出在客戶端的IXmlSerializable
實例?
通常,通過SOAP或WCF定製序列化(通過IXmlSerializable
)是一個壞主意。如果你正在使用與WCF進行程序集共享(即代替生成代理,將DTO程序集發佈到客戶端),那麼它可以工作,但它仍然違反SOA/mex等。實際上,我很驚訝它不只是給你XmlElement
或類似的,但是嘿!
我將你現有的(IXmlSerializable
)對象模型簡單地映射到簡單的類型,可以使用標準序列(即無IXmlSerializable
)。
BTW;你看過ADO.NET數據服務嗎?這已經在線路上處理Expression
(儘管不是一個值)。作爲值傳遞,MetaLinq。
我意識到這是一個老問題,但這裏未來的讀者是我發現:實現IXmlSerializable
需要有爲了定義的架構爲他們與WSDL工作
對象,否則淨由於序列化是自定義的,因此框架不知道如何定義合同。
要指定模式,您不應在IXmlSerializable接口中使用GetSchema方法,而應使用XmlSchemaProvider
屬性(msdn link)。您可以在模式提供程序部分閱讀有關Microsoft的文章Enrich Your XML Serialization With Schema Providers In The .NET Framework的更多信息。
您可以在XmlSchemaProvider屬性頁和文章中找到示例,我建議將您的模式存儲在.xsd文件中,並像示例中一樣讀取它們。通過代碼編寫架構充其量是麻煩的。
一旦我實現模式提供程序,序列化按預期工作。如果您的WCF服務是IIS託管的,請參閱有關如何通過反射Can I use reflection to find the bin/[Configuration] folder in ASP.NET instead of the asp temporary folder獲取正確的IIS目錄的問題。從微軟的文章
例子:
[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;
}
...
}