什么是适合Web服务的XML类型?

时间:2009-06-18 15:06:25

标签: c# xml wcf xmldocument xelement

当前实施

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看起来是正确的,我知道我必须做一些翻译,但希望尽可能接近合适。

4 个答案:

答案 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在这里有钱。稍微详细说一下,如果你看一下返回XmlElementXElement时生成的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)

通常,XDocumentXElememnt在性能方面优于XmlDocumentXmlElement

但是,我建议使用string通过WCF服务发送XML文档,原因如下:

  1. 互操作性
    • 客户端不依赖于特定的.NET框架版本(客户端可以选择使用XDocumentXmlDocument。只要以这种方式配置WCF服务,甚至可以支持基于Java的客户端) 。
  2. 如果原始XML文档包含Xml声明,则正确处理Xml声明。
  3. 注意:请确保适当调整配置以支持大型xml文档。例如,basicHttpBinding的默认最大邮件大小为64KB。