0

The following error occurs whenthe client code running in CF 3.5 on a windows mobile 6.5 device tries to call our wcf service... before it ever even makes the call.

What is odd is that the exception DOES NOT occur when running under the debugger in VS and the phone is connected to the PC via the USB cable... The call works as expected.. data goes back and forth as it is supposed to...

But when running on its own, the CFClientBase code generates the following Stackoverflow Exception ??

This happens for all service calls, not just the one... Any Ideas ?

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()

Edit

It appears that even though I am using DTOs to serialize across the wire... Somehow my EF Entity Classes are being sent in the schema ??

And for some reason those types are trying to be constructed when the service calls are made ??

How do I keep the classes out of the schema ? If there is a reference to the namespace of the Entities is that enough for WCF to pull those classes into the schema ?

4

2 に答える 2

0

通常、オブジェクトグラフに再帰の問題がある場合、シリアル化中にスタックオーバーフロー例外が発生します-「無限ルックアップ」。したがって、たとえば、;Classのコレクションを持つがあります。StudentそれぞれStudentにいくつかがありClasses、それぞれClassにコレクションがありStudent、以下同様です。

デバッガーで実行しても問題は発生しないため、これはおそらく私が説明したシナリオではありませんが、大きなオブジェクトグラフがあり、グラフ全体をシリアル化しようとしている同様のシナリオがあります。コンパクトフレームワークについてはよくわかりませんが、スタックが小さい可能性があります(したがって、デバイスではスタックオーバーフローが発生しますが、Visual Studioでは発生しません)。

どんなリクエストをしていますか?明らかに、あなたはたくさんのデータをシリアル化しています。どれくらい深くなりますか?より小さなデータセットでリクエストを機能させることができますか?

最初にもっと小さなリクエストを試して、ネットワーク(または「空中」)で必要以上のデータを送信しているかどうかを確認することをお勧めします。

于 2012-04-26T02:24:16.100 に答える
0

エンティティタイプがWCFサービスインターフェイスに公開されており、DataContractまたはDataMember属性で装飾されていないことが判明したため、WCFサービスは、エンティティ自体のナビゲーションプロパティを介して名前空間内のすべてのエンティティをプルしたようです。 。

DataContractをクラスに適用し、次にDataMembersをスカラープロパティにのみ適用すると、私が求めていたものが得られ、シリアル化したくない他のすべてのタイプが除外されました。

ありがとう !

于 2012-04-26T18:47:49.087 に答える