2012-04-26 2 views
0

Произошла следующая ошибка, когда клиентский код, запущенный в CF 3.5 на устройстве Windows Mobile 6.5, пытается вызвать нашу службу wcf ... прежде чем он когда-либо даже позвонит.WCF CFClientBase Сериализация Stackoverflow Exception?

Чрезвычайно то, что исключение НЕ происходит при работе под отладчиком в VS и телефон подключен к ПК через USB-кабель ... Звонок работает так, как ожидалось .. данные идут туда и обратно, поскольку он Предполагается, что ...

Но при запуске самостоятельно, код CFClientBase генерирует следующее исключение Stackoverflow?

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

StackOverflowException 

    at System.Reflection.CustomAttribute.GetObject() 
    at System.Reflection.CustomAttribute.CheckConsistencyAndCreateArray(CustomAttribute caItem, Type caType) 
    at System.Reflection.CustomAttribute.GetCustomAttributes(MemberInfo member, Type caType, Boolean inherit) 
    at System.Reflection.CustomAttribute.GetCustomAttributes(Type type, Type caType, Boolean inherit) 
    at System.RuntimeType.GetCustomAttributes(Boolean inherit) 
    at System.Xml.Serialization.TypeAttributes..ctor(ICustomAttributeProvider prov) 
    at System.Xml.Serialization.TypeAttributes..ctor(ICustomAttributeProvider prov, XmlAttributes xmlAtts) 

at System.Xml.Serialization.XmlSerializationReflector.AddType(Type type, Boolean encoded, String defaultNS, Boolean genericNullableArg) 
    at System.Xml.Serialization.XmlSerializationReflector.FindType(Type type, Boolean encoded, Boolean genericNullableArg, String defaultNamespace) 
    at System.Xml.Serialization.XmlSerializationReflector.FindType(Type type, Boolean encoded, String defaultNamespace) 
    at System.Xml.Serialization.XmlSerializationReflector.ResolveLiteralTypeUsingDeclaredType(Type memberType, String defaultNS, LogicalType& type, LogicalType& elementType, Boolean& isArray) 
    at System.Xml.Serialization.XmlSerializationReflector.ResolveLiteralType(String attrDataType, Type attrType, Type memberType, String defaultNS, Boolean& isArray, LogicalType& type, LogicalType& elementType) 
    at System.Xml.Serialization.XmlSerializationReflector.ReflectXmlElementAttributes(Type memberType, LogicalMemberValue memberValue, String memberName, LiteralAttributes attrProv, AccessorCollection memberAccessors, String defaultName, String defaultNS, Type& serializingType, Boolean& shouldBeOrdered) 
    at System.Xml.Serialization.XmlSerializationReflector.ReflectLiteralMemberValue(Type memberType, String memberName, LiteralAttributes attrProv, String defaultName, String defaultNS, IEntityFinder memberFinder, Boolean canRead, Boolean canWrite, Boolean& shouldBeOrdered) 
    at System.Xml.Serialization.XmlSerializationReflector.ReflectMemberValue(Type memberType, ICustomAttributeProvider attrProv, String defaultName, String defaultNS, IEntityFinder memberFinder, Fetcher fetcher, Fixup fixup, MemberValueCollection members, Boolean encoded, Boolean canRead, Boolean canWrite, Byte& specialType, Boolean& shouldBeOrdered) 
    at System.Xml.Serialization.XmlSerializationReflector.addComplexTypeMemberHelper(Type type, MemberInfo member, Boolean encoded, String defaultNS, Boolean& shouldBeOrdered, IEntityFinder choiceFinder, MemberValueCollection members, String typeNS, String defaultMemberNS, Int32& sequenceId) 
    at System.Xml.Serialization.XmlSerializationReflector.AddComplexType(Type type, TypeAttributes attrs, String typeName, String typeNS, Boolean typeIsNullable, Boolean encoded, String defaultNS, Boolean genericNullableArg) 
    at System.Xml.Serialization.XmlSerializationReflector.AddType(Type type, Boolean encoded, String defaultNS, Boolean genericNullableArg) 
    at System.Xml.Serialization.XmlSerializationReflector.FindType(Type type, Boolean encoded, Boolean genericNullableArg, String defaultNamespace) 
    at System.Xml.Serialization.XmlSerializationReflector.FindType(Type type, Boolean encoded, String defaultNamespace) 
    at System.Xml.Serialization.XmlSerializationReflector.ReflectIncludedTypes() 
    at System.Xml.Serialization.XmlSerializer..ctor(Type type, XmlAttributeOverrides overrides, Type[] extraTypes, XmlRootAttribute root, String defaultNamespace) 
    at Microsoft.Tools.ServiceModel.CFClientBase`1.CFContractSerializer.createSerializer(XmlQualifiedName wrapper) 
    at Microsoft.Tools.ServiceModel.CFClientBase`1.CFContractSerializer..ctor(CFContractSerializerInfo info) 
    at Microsoft.Tools.ServiceModel.CFClientBase`1.GetContractSerializer(CFContractSerializerInfo info) 
    at Microsoft.Tools.ServiceModel.CFClientBase`1.Invoke[TREQUEST,TRESPONSE](CFInvokeInfo info, LogIntoServerRequest request) 
    at WCFService.WOService.WOServiceClient.LogIntoServer(LogIntoServerRequest request) 
    at WCFService.WOService.WOServiceClient.LogIntoServer(SmartPhoneLoginCredentials creds) 
    at RescoMobileApp.Common.Classes.loginClass.LogIntoServer() 

Редактировать

Оказывается, что даже если я использую DTOs сериализовать по проводам ... Как-то мои классы EF Entity посылаются в схеме ??

И по какой-то причине эти типы пытаются построить, когда производятся служебные звонки?

Как сохранить классы вне схемы? Если есть ссылка на пространство имен Entities, достаточно ли для WCF вывести эти классы в схему?

ответ

0

Обычно исключение stackoverflow возникает во время сериализации при наличии проблемы рекурсии в графе объектов - «бесконечный поиск». Так, например, у вас есть Class, в котором есть коллекция Student; каждый Student имеет некоторые Classes, каждый Class имеет коллекцию Student и так далее навсегда.

Ваша проблема не возникает под управлением отладчика, поэтому, вероятно, это не сценарий, который я описал, но есть аналогичный сценарий, где у вас большой граф объектов и вы пытаетесь сериализовать весь граф. Я мало знаю о компактной структуре, но, скорее всего, стек меньше (следовательно, stackoverflow на устройстве, но не в визуальной студии).

Какая просьба вы делаете? Очевидно, вы сериализуете множество данных; насколько глубоко это происходит? Можете ли вы заставить запрос работать с меньшим набором данных?

Сначала я попробую попросить гораздо меньший запрос и проверить, отправляется ли вам больше данных, чем требуется по проводу (или «воздуху»).

+0

Каждый запрос терпит неудачу ... Даже очень маленький объектный граф из 9 экземпляров класса с 4 свойствами .... Я собираюсь перезагрузить фреймворк CF на телефонах, возможно, одна или несколько DLL - это неправильная версия или поврежденный –

+0

Вы были правы, исключение SO было связано с ограниченной памятью и стеком на CF ....Избавьтесь от сущностей, которые я не знал, были включены в документы xsd, и это сделало трюк! –

0

Оказалось, что тип сущности был открыт для интерфейса службы WCF и что он не был украшен никакими атрибутами DataContract или DataMember, поэтому служба WCF, по-видимому, потянула каждый объект в пространстве имен (s) с помощью свойств навигации на сами субъекты ...

Применение DataContract к классу, а затем DataMembers только на скалярных свойств у меня, что я был после того, как и ушел из всех остальных типов, которые я не хотел сериализованную

Спасибо!

+0

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

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

  • Нет связанных вопросов^_^