Первый запрос WCF, клиент всегда выдает System.Xml.XmlException: есть несколько корневых элементов - PullRequest
1 голос
/ 16 июля 2009

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

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

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

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

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

Спасибо

Ответы [ 2 ]

3 голосов
/ 17 июля 2009

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

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

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

Спасибо за всеобщее мнение.

1009 * Натан *

0 голосов
/ 16 июля 2009

Это звучит как проблема с сериализацией. Я бы исследовал, как вы строите свои DataContracts - вы используете DataContracts, а не атрибуты сериализации 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; } 
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...