2009-12-16 10 views
1

Я строю веб-службы WCF, которая возвращает составной объект, который выглядит примерно следующим образом:WCF не вернешь XmlElement из 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; 
    } 

Однако, когда я использую следующий код, который принимает 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; 
     } 

Деталь CommunicationException является:

[CommunicationException: Сервер не обеспечивает значимый ответ; это может быть вызвано несоответствием контракта, преждевременным отключением сеанса или внутренней ошибкой сервера.]

Я также обновил ссылку на обслуживание в своем тестовом приложении несколько раз, что не повлияло.

Является ли проблема с моим тестовым кодом, вызывающим веб-сервис? Почему преобразование XmlElement в XElement, а затем обратно в XmlElement исправить проблему? Любая информация вообще была бы высоко оценена! :)

ответ

2

Я не знаю ничего странного XmlDataDocument, но вам не обязательно нужен XDocument - попробуйте:

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

Еще не идеальна, но она выглядит чище, мне ...

+0

Спасибо! Это также работает - все равно было бы хорошо знать, какая именно проблема связана с элементом документа XmlDataDocument и WCF. :) –

1

Ну, чтобы получить дополнительную информацию об ошибке, вам нужно будет включить данные отладки в ошибке вашего сервера - сообщение, которое вы получаете прямо сейчас, - это общий, раскрывающий-ничего-возможно- нападавших сообщение об ошибке WCF, в основном говоря: что-то пошло не так.

Для того, чтобы сделать это, вам нужно настроить свой конфиг сервис - добавить этот раздел (если вы уже не имеете один):

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

и затем ссылаться на этот раздел из вашего определения службы:

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

Это должно дать вам более значимую ошибку, которая, надеюсь, дает вам представление о том, что происходит не так.

В противном случае вам нужно будет отладить ваш серверный код и узнать, что там происходит.

+0

Это удобно знать, но, к сожалению, это не дает никакой дополнительной информации в методе CommunicationException. –

Смежные вопросы