当前实施
Sql Server 2005数据库,带有一个名为messages的表,其列名为MessageXml,类型为xml。
C#Library项目,带有Linq to Sql类,它生成一个名为Message的类,其字段名为MessageXml,类型为XElement。
WCF Webservice,它使用名为MessageXml的XElement类型的属性公开MessagePayload类。
Web服务不提供由Linq创建的Message类到Sql。我使用一个轻量级物体作为介于两者之间。
问题
XElement是否真的是我希望在我的WCF服务中使用的类型,或者是否有更好的类型。要传递给服务的xml应该是完整的doc。另外,我在将xml文档作为XElement加载时遇到了一些麻烦。我认为我应该在服务的轻量级中公开一个完整的xml文档类型,但我对XDocument和XmlDocument之间的差异感到有点困惑。
除此之外,我不能使用XDocument类型的属性公开WCF Message类,因为它包含无法序列化的XDeclaration类型的属性。
如果我使用XmlDocument而不是我必须在Linq类和轻量级类之间的翻译中进行奇怪的xml类型转换。
XmlDocument doc = new XmlDocument();
doc.LoadXml(message.MessageXml.ToString());
MessageEnvelope retVal = new MessageEnvelope()
{
MessageXml = doc,
};
XmlDocument看起来是正确的,我知道我必须做一些翻译,但希望尽可能接近合适。
答案 0 :(得分:3)
您可以使用XElement或XmlElement:
public XmlElement GetXmlElement()
{
var doc = new XmlDocument();
doc.Load(PREFIX + @"Enumerations.wsdl");
return doc.DocumentElement;
}
public XElement GetXElement()
{
var doc = XDocument.Load(PREFIX + @"Enumerations.wsdl");
return doc.Root;
}
您既不需要XDocument
也不想XmlDocument
。请记住,无论您返回什么,都将位于包含SOAP信封的XML文档的中间。你不能在文档中包含文档,所以你想要的是一个元素。
答案 1 :(得分:3)
John Saunders在这里有钱。稍微详细说一下,如果你看一下返回XmlElement
或XElement
时生成的WSDL,你会看到如下内容:
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0" processContents="lax"/>
</xs:sequence>
</xs:complexType>
就是这样。它基本上意味着任何XML都可以在这里。这也意味着,与Chansik的建议相反,它不会将返回类型绑定到.NET特定类型。
所以是的,你不需要使用字符串。
答案 2 :(得分:-1)
使用序列化类所需的任何类型(String对我来说一直很好)然后在服务器或客户端进行必要的转换以保持文档的完整性。你也可以用一个或多个XElements构建一个XDocument,所以我会使用XElement。
最糟糕的情况是,你甚至可以覆盖你班级的序列化行为(如果你对反思很好的话,也不会太糟糕)。
XmlDocument是旧的非Linq文档。它们是在不同类中实现的相同概念。
答案 3 :(得分:-2)
通常,XDocument
和XElememnt
在性能方面优于XmlDocument
和XmlElement
。
但是,我建议使用string
通过WCF服务发送XML文档,原因如下:
XDocument
或XmlDocument
。只要以这种方式配置WCF服务,甚至可以支持基于Java的客户端) 。 注意:请确保适当调整配置以支持大型xml文档。例如,basicHttpBinding
的默认最大邮件大小为64KB。