2009-12-16 33 views
1

我建立它返回一個複合對象,它類似於一個WCF Web服務返回的XmlElement如下:WCF無法從XmlDataDocument.DocumentElement

[DataContract] 
    public class WebServiceReturn 
    { 
     ... 

     [DataMember] 
     public XmlElement Results { get; set; } 

     ... 
    } 

當我返回WebServiceReturn對象用下面的代碼,一切都很好:

XElement cities = new XElement("Cities", 
          from r in results 
          select new XElement("City", r));    

    using (XmlReader xmlReader = cities.CreateReader()) 
    { 
     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(xmlReader); 
     WebServiceReturn response = new WebServiceReturn(); 
     response.Results = xmlDoc.DocumentElement; 
    } 

然而,當我使用下面的代碼,這需要從存儲過程調用返回一個XmlDataDocument的結果的的XmlElement,一個的CommunicationException拋出(沒有內例外)。

XmlDataDocument xdd = DataAccess.ExecuteXML("MyStoredProc", parameter); 
response.Results = xdd.DocumentElement; 

混亂的部分是,如果我轉換XmlDataDocument.DocumentElement(這是一個的XmlElement)轉換成的XElement再放回一個的XmlElement,不存在任何問題(哇這是一個一口) - 所以下面的代碼沒有問題返回。

 XmlElement xe = DataAccess.ExecuteXML("MyStoredProc", parameter).DocumentElement; 
     XDocument xDoc = new XDocument(); 
     using (XmlWriter xmlWriter = xDoc.CreateWriter()){ 
      xe.WriteTo(xmlWriter); 
     } 

     using (XmlReader xmlReader = xDoc.Root.CreateReader()) 
     { 
      XmlDocument xmlDoc = new XmlDocument(); 
      xmlDoc.Load(xmlReader); 
      response.Results = xmlDoc.DocumentElement; 
     } 

的細節的CommunicationException是:

[的CommunicationException:服務器未提供有意義的回覆;這可能是由合同的不匹配,過早的會話關閉或內部服務器錯誤引起的。]

我已經多次已經沒有效果還更新在我的測試應用程序的服務引用。

與被調用Web服務我的測試代碼中的問題?爲什麼要將XmlElement轉換爲XElement,然後返回到XmlElement中解決該問題?任何信息都將非常感謝! :)

回答

2

我不知道XmlDataDocument什麼奇怪的,但你不一定需要XDocument - 嘗試:

XmlDocument newDoc = new XmlDocument(); 
newDoc.Load(new XmlNodeReader(doc.DocumentElement)); 
return newDoc.DocumentElement; 

仍不理想,但它看起來更清潔,我...

+0

謝謝!這也適用 - 仍然很高興知道與XmlDataDocument的文檔元素和WCF工作的確切問題是通過:) – 2009-12-17 01:24:38

1

好吧,爲了獲得更多的錯誤信息,你需要使你的服務器的故障調試細節 - 現在你得到的消息是通用的,揭示全無至possible-攻擊者WCF錯誤信息,基本上說:出了問題。

爲了做到這一點,你需要調整你的服務配置 - 添加此部分(如果你不已經有一個):

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MEXandDebug"> 
     <serviceMetadata /> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

,然後從你的服務定義引用部分:

<services> 
    <service behaviorConfiguration="MEXandDebug" name="WCFService.MyWCFService"> 

這應該會給你一個更有意義的錯誤,希望能給你一個想法出了什麼問題。

否則,你就需要調試到你的服務器端代碼,並找出發生了什麼那裏。

+0

這很方便知道,但不幸的是,啓用它並沒有給出拋出的CommunicationException中的任何附加信息。 – 2009-12-17 01:25:25