2

当前实施

Sql Server 2005 数据库带有一个名为 messages 的表和一个名为 MessageXml 的 xml 类型的列。

具有 Linq to Sql 类的 C# 库项目,该类生成一个名为 Message 的类,其中包含一个名为 MessageXml 的 XElement 类型的字段。

WCF Web 服务公开一个 MessagePayload 类,该类具有一个名为 MessageXml 的 XElement 类型的属性。

该网络服务不提供我由 Linq to Sql 创建的 Message 类。我使用一个轻量级的物体作为中间人。

问题

XElement 真的是我想在 WCF 服务中使用的类型,还是有更好的类型。打算传递给服务的 xml 应该是一个完整的文档。此外,我在将 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

4 回答 4

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 文档的中间。您不能在文档中包含文档,因此您想要的是一个元素。

于 2009-07-27T03:27:07.927 回答
3

约翰桑德斯在这里赚钱。稍微详细说明一下,如果您查看在返回 anXmlElement或 an时生成的 WSDL XElement,您会看到如下内容:

<xs:complexType>
  <xs:sequence>
    <xs:any minOccurs="0" processContents="lax"/>
  </xs:sequence>
</xs:complexType>

就是这样。这基本上意味着任何 XML 都可以放在这里。这也意味着,与 Chansik 的建议相反,它不会将返回类型绑定到 .NET 特定类型。

所以是的,你不需要使用字符串。

于 2009-12-10T00:19:26.720 回答
-1

使用您需要的任何类型来序列化类(字符串对我来说一直很有效),然后在需要时在服务器或客户端进行转换以保持文档的完整性。你也可以用一个或多个 XElement 构建一个 XDocument,所以我会选择 XElement。

最坏的情况,你甚至可以覆盖你的类的序列化行为(如果你擅长反射,那就不太糟糕了)。

XmlDocument 是旧的非 Linq 文档。它们是在不同类中实现的相同概念。

于 2009-06-18T15:17:11.333 回答
-2

一般来说,并且XDocument在性能方面XElememnt更可取。XmlDocumentXmlElement

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

  1. 互操作性
    • 客户端不依赖于特定的 .NET 框架版本(客户端可以选择使用XDocumentXmlDocument。即使是基于 Java 的客户端也可以支持,只要 WCF 服务以这种方式配置即可)。
  2. 如果原始 XML 文档包含 Xml 声明,则正确处理它。

注意:请确保适当调整配置以支持大型 xml 文档。例如,basicHttpBinding的默认最大消息大小为 64KB。

于 2009-07-27T03:55:00.260 回答