WCF не может вернуть XmlElement из XmlDataDocument.DocumentElement - PullRequest
1 голос
/ 16 декабря 2009

Я создаю веб-сервис 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;
        }   

Сведения об исключении связи:

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

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

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

Ответы [ 2 ]

2 голосов
/ 16 декабря 2009

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

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

Все еще не идеал, но для меня это выглядит чище ...

1 голос
/ 16 декабря 2009

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

Чтобы сделать это, вам нужно настроить конфигурацию сервиса - добавьте этот раздел (если у вас его еще нет):

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

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

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

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

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

...