WCF не может вернуть XmlElement из XmlDataDocument.DocumentElement
-
19-09-2019 - |
Вопрос
Я создаю веб-службу WCF, которая возвращает составной объект, похожий на следующий:
[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;
}
Однако когда я использую приведенный ниже код, который берет XmlElement из результатов вызова хранимой процедуры, возвращающей XmlDataDocument, выдается исключение 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;
}
Подробности исключения связи:
[Исключение связи:Сервер не предоставил значимого ответа;это может быть вызвано несоответствием контракта, преждевременным завершением сеанса или внутренней ошибкой сервера.]
Я также несколько раз обновлял ссылку на службу в своем тестовом приложении, но это не дало никакого эффекта.
Проблема в моем тестовом коде, вызывающем веб-службу?Почему преобразование 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">
Это должно дать вам более значимую ошибку, которая, надеюсь, даст вам представление о том, что пошло не так.
В противном случае вам придется выполнить отладку кода на стороне сервера и выяснить, что там происходит.