WCF无法从XmlDataDocument.DocumentElement返回的XmlElement
-
19-09-2019 - |
题
我建立该返回复合对象看起来类似于以下内容的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">
这应该给你一个更有意义的错误,它希望给你一个想法是什么出了问题。
否则,你就需要调试到你的服务器端代码,并找出发生了什么那里。