Первый запрос WCF, клиент всегда выдает System.Xml.XmlException: существует несколько корневых элементов

Каждый раз, когда запускается мой пул приложений WCF Host, клиент, выполняющий первый вызов WCF, всегда выдает «System.Xml.XmlException: существует несколько корневых элементов». Все последующие вызовы работают отлично.

Это исключение происходит на стороне потребителя/клиента запроса WCF. Я тестировал это как для полного клиента WCF, так и для клиента Silverlight. Он использует basicHttpBinding, без безопасности и aspnetCompatabilityMode = true

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

Я также должен упомянуть, что пул приложений иногда начинается с запроса, отличного от WCF, на другую страницу. Но все же при первом вызове WCF он все равно выдает это исключение на стороне клиента.

Кто-нибудь видел это? При необходимости могу предоставить более подробную информацию.

Спасибо


person Nathan    schedule 16.07.2009    source источник
comment
Сомневаюсь: bing. ком/   -  person John Saunders    schedule 16.07.2009


Ответы (2)


Хорошо, изучив эти варианты, я понял, что вызвало проблему. В конечном счете, наследование и наличие обоих атрибутов, сериализуемого и DataContract, в обмениваемых данных не повлияло на десериализацию ответа.

Настоящая суть проблемы заключалась в моей конфигурации. Ранее я играл с потоковыми сообщениями. Я оставил для своего хоста TransferMode значение Streaming, а для моего клиента — Buffered. В Silverlight это мой единственный вариант. Таким образом, проблема сериализации возникла из-за того, что сообщение было разбито на части. Я заметил это после отслеживания нескольких звонков.

Так легко исправить. Переключите режим передачи на буферизованный. Я собираюсь настроить отдельную конечную точку для потоковой передачи и поиграть с ней в другой раз. Мне не нужно транслировать сервисы CRUD.

Спасибо за вклад каждого.

-Натан

person Nathan    schedule 17.07.2009
comment
Решил мою проблему!! большое спасибо - person Sawan; 10.10.2012

Мне это кажется проблемой сериализации. Я бы исследовал, как вы создаете свои контракты данных — вы используете контракты данных, а не атрибуты сериализации XML, верно?

Редактировать. Основываясь на наших комментариях, я дам вам рекомендацию по рефакторингу:

[DataContract] 
public class ImageEffectExcludeParamRequest
{ 
    [DataMember] 
    public string ImageID { get; set; } 

    [DataMember] 
    public int EffectID { get; set; } 

    [DataMember]
    public ResponseInfo AdditionalInfo { get; set; }
}


[DataContract] 
public class ResponseInfo 
{ 
    [DataMember] 
    public Enums.ServiceResponse.Status Status { get; set; } 

    [DataMember] 
    public string Message { get; set; } 
}

Использование композиции вместо наследования должно решить вашу проблему.

person Randolpho    schedule 16.07.2009
comment
Да, это все простые классы только с атрибутами DataContract, DataMember. Хм... некоторые операции имеют параметры, которые включают сущности как с Serializable, так и с DataContract по другим причинам. Этот, который я тестировал, не работает. Значение ответа является унаследованным объектом. [DataContract] открытый класс ImageEffectExcludeParamRequest: RequestBase { [DataMember] общедоступная строка ImageID { get; установлен; } [DataMember] public int EffectID { get; установлен; } } - person Nathan; 16.07.2009
comment
[DataContract] открытый абстрактный класс ResponseBase { [DataMember] public Enums.ServiceResponse.Status Status { get; установлен; } [DataMember] сообщение общедоступной строки { get; установлен; } public ResponseBase() { this.Status = Status.NotSet; это.Сообщение = ноль; } } - person Nathan; 16.07.2009
comment
я бы провел рефакторинг; не беспокойтесь об ResponseBase для ваших контрактов данных. Вместо этого продублируйте то, что необходимо, или инкапсулируйте информацию в отдельном поле. - person Randolpho; 16.07.2009
comment
Я копаюсь в нем сейчас и понимаю, что он делает свой первый вызов (до того, который я упомянул выше) к одной из операций, которая возвращает элементы как с сериализуемым, так и с контрактом данных. Сначала я проведу рефакторинг сериализуемого и проверю. Я использую реферат по совершенно другой причине. Я только что вставил очень урезанную версию. Спасибо, я протестирую и покажу свои результаты здесь. - person Nathan; 16.07.2009
comment
Если первый не сработает, попробую ваш композиционный раствор. Спасибо! - person Nathan; 16.07.2009