目前的实施

Sql Server 2005 数据库有一个名为 messages 的表,其中有一个名为 MessageXml、类型为 xml 的列。

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

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

Web 服务不提供 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 似乎是正确的,我知道我必须做一些翻译,但希望尽可能接近合适的翻译。

有帮助吗?

解决方案

您可以使用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文档的中间。你不能在文档中包含文档,所以你想要的是一个元素。

其他提示

John Saunders在这里有钱。稍微详细说一下,如果你看一下返回 XmlElement XElement 时生成的WSDL,你会看到类似这样的东西:

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

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

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

使用序列化类所需的任何类型(String对我来说一直很好)然后在服务器或客户端进行必要的转换以维护文档的完整性。你也可以用一个或多个XElements构建一个XDocument,所以我会使用XElement。

最糟糕的情况是,你甚至可以覆盖你班级的序列化行为(如果你对反思很好的话,也不会太糟糕)。

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

一般来说, XDocumentXElememnt 优于 XmlDocumentXmlElement 在性能方面。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top