2009-06-18 46 views
2

當前實現什麼是適合Web服務的XML類型?

SQL Server 2005數據庫有一個表叫了一個名爲XML類型的MessageXml列的消息。

C#使用Linq to Sql類的庫項目,該類使用名爲MessageXml的類型爲XElement的字段生成名爲Message的類。

WCF Webservice,公開一個MessagePayload類,其中包含一個名爲MessageXml的XElement類型的屬性。

Web服務不提供由Linq創建的消息類到Sql。我使用重量輕的物體作爲之間的一部分。

問題

是真正的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似乎是正確的,我知道我必須做一些翻譯,但希望得到儘可能接近適合作爲可能的。

回答

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

使用您需要的任何類型來序列化類(字符串一直適用於我),然後在服務器或客戶端進行必要的轉換以維護文檔的完整性。您還可以從一個或多個XElement中構建一個XDocument,因此我將使用XElement。

最糟糕的情況是,你甚至可以重載你的類的序列化行爲(如果你對反射有好處,那麼不會太糟糕)。

XmlDocument是舊的非Linq文檔。它們是在不同類別中實施的相同概念。

+1

-1:XML與字符串不同。不要用它來表示XML。 – 2009-07-27 03:25:18

+0

我知道,這就是爲什麼你必須驗證它在序列化轉換前後... – marr75 2009-07-28 16:06:13

-2

就性能而言,通常,XDocumentXElememnt優選爲XmlDocumentXmlElement

不過,我會建議使用string通過WCF服務發送一個XML文件,原因如下:

  1. 互操作性
    • 客戶端不依賴於特定的.NET framework版本(客戶可以選擇使用XDocumentXmlDocument。只要WCF服務以這種方式配置,即使基於Java的客戶端也可以被支持)。
  2. 如果原始XML文檔包含它,則正確處理Xml聲明。

注意:請確保適當地調整配置以支持大的xml文檔。例如,basicHttpBinding的默認最大消息大小爲64KB。

3

約翰桑德斯在這裏的錢。稍微詳細說明,如果你看一下所生成的WSDL當您返回任何一個XmlElementXElement,你會看到這樣的事情:

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

就是這樣。它基本上意味着任何XML都可以在這裏。這也意味着,與Chansik的建議相反,它不會將返回類型綁定到.NET特定類型。

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