2009-12-16 56 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