我建立该返回复合对象看起来类似于以下内容的WCF web服务:

    [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的解决这个问题?任何信息,将不胜感激! :)

有帮助吗?

解决方案

我不知道什么古怪XmlDataDocument,但你不一定需要XDocument - 尝试:

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

仍不理想,但它看起来更清洁,我...

其他提示

那么,为了获得更多的错误信息,你需要使你的服务器的故障调试细节 - 现在你得到的消息是通用的,揭示全无到可能的,攻击者WCF错误消息,基本上说:出事了。

为了做到这一点,你需要调整你的服务配置 - 添加此部分(如果你不已经有一个):

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

,然后引用该部分从服务定义:

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

这应该给你一个更有意义的错误,它希望给你一个想法是什么出了问题。

否则,你就需要调试到你的服务器端代码,并找出发生了什么那里。

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