2009-07-16 3 views
1

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

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

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

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

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

Благодаря

+0

Сомневаюсь: http://www.bing.com/search?q=XmlException+%22multiple+root+elements%22+wcf&go=&form=QBRE&qs=n –

ответ

3

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

Реальное мясо проблемы было в моей конфигурации. Раньше я играл с потоковыми сообщениями. Я оставил свой host transferMode установленным для Streaming, и мой клиент был настроен на Buffered. В silverlight это мой единственный вариант. Поэтому проблема сериализации произошла из-за того, что сообщение было разбито на разделы. Я заметил это после прослеживания нескольких звонков.

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

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

Натан
+0

Решил мою проблему !! спасибо очень –

0

Это звучит для меня как вопрос сериализации. Я бы исследовал, как вы создаете свои DataContracts - вы используете DataContracts, а не атрибуты сериализации XML, правильно?

Edit: Основываясь на наших комментариях, я собираюсь дать рекомендацию для вашего рефакторинга:

[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; } 
} 

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

+0

Правильно, Они все простые классы с атрибутами DataContract, DataMember. Хм ... некоторые операции имеют параметры, которые включают объекты с Serializable и DataContract по другим причинам. Однако этот тест я не тестировал. Значение ответа является наследуемым объектом. \t [DataContract] \t общественного класса ImageEffectExcludeParamRequest: RequestBase \t { \t \t [DataMember] \t \t общественная строка ImageID {получить; задавать; } \t \t [DataMember] \t \t public int EffectID {get; задавать; } \t} – Nathan

+0

[DataContract] \t общественного абстрактного класса ResponseBase \t { \t \t [DataMember] \t \t общественного Enums.ServiceResponse.Status состояния {получить; задавать; } \t \t [DataMember] \t \t общественная строка Сообщение {get; задавать; } \t \t общественного ResponseBase() \t \t { \t \t \t this.Status = Status.NotSet; \t \t \t это.Message = null; \t \t} \t} – Nathan

+0

Я бы рефакторинг; не мешайте ResponseBase для ваших контрактов с данными. Вместо этого дублируйте то, что вы должны или инкапсулируете информацию в отдельном поле. – Randolpho