【问题标题】:WCF Can't Return XmlElement from XmlDataDocument.DocumentElementWCF 无法从 XmlDataDocument.DocumentElement 返回 XmlElement
【发布时间】:2009-12-16 04:56:20
【问题描述】:

我正在构建一个 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: 服务器没有提供有意义的回复;这可能是由于合同不匹配、会话过早关闭或内部服务器错误造成的。]

我还多次更新了我的测试应用程序中的服务参考,但没有任何效果。

调用 Web 服务的测试代码有问题吗?为什么将 XmlElement 转换为 XElement 然后再转换回 XmlElement 可以解决问题?任何信息都将不胜感激! :)

【问题讨论】:

    标签: c# xml wcf linq-to-xml xelement


    【解决方案1】:

    我不知道 XmlDataDocument 有什么奇怪的地方,但你不一定需要 XDocument - 试试:

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

    仍然不理想,但对我来说看起来更干净......

    【讨论】:

    • 谢谢!这也有效 - 仍然很高兴知道使用 XmlDataDocument 的文档元素和 WCF 的确切问题是什么 :)
    【解决方案2】:

    好吧,为了获得更多错误信息,您需要在服务器故障中启用调试详细信息 - 您现在收到的消息是通用的、没有任何可能的攻击者的 WCF 错误消息,基本上是说:出了点问题。

    为此,您需要调整服务配置 - 添加此部分(如果您还没有):

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

    然后从您的服务定义中引用该部分:

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

    这应该会给你一个更有意义的错误,希望它能让你知道哪里出了问题。

    否则,您需要调试服务器端代码并​​找出那里发生的情况。

    【讨论】:

    • 这很容易知道,但不幸的是,启用它并没有在抛出的 CommunicationException 中提供任何其他信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 2011-08-27
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多