0

正直なところ、私は完全に疲れ果てています。どうすればいいのか本当にわかりません。Silverlight wcf を使用して Silverlight アプリケーションを開発しています。私のwebconfigは次のようになります:

<system.web>
<httpRuntime maxRequestLength="2147483647" />
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Information,Error,ActivityTracing"     propagateActivity="true" >
<listeners>
<add name="xml" />
</listeners>
        </source>
        <source name="CardSpace">
            <listeners>
                <add name="xml" />
            </listeners>
        </source>
        <source name="System.IO.Log">
            <listeners>
                <add name="xml" />
            </listeners>
        </source>
        <source name="System.Runtime.Serialization" switchValue="Information,Error,ActivityTracing">
            <listeners >
                <add name="xml" />
            </listeners>
        </source>
        <source name="System.IdentityModel">
            <listeners>
                <add name="xml" />
            </listeners>
        </source>

        <source name="System.ServiceModel.MessageLogging">
            <listeners>
                <add name="xml"/>
            </listeners>
        </source>
        <source name="myUserTraceSource"
                switchValue="Information, ActivityTracing">
            <listeners>
                <add name="xml"/>
            </listeners>
        </source>
    </sources>
    <sharedListeners>
        <add name="xml"
             type="System.Diagnostics.XmlWriterTraceListener"
                   initializeData="e:\Traces.svclog"

             />
    </sharedListeners>
</system.diagnostics>


<system.serviceModel>

    <diagnostics>
        <messageLogging
 logEntireMessage="true"
 logMalformedMessages="true"
 logMessagesAtServiceLevel="true"
 logMessagesAtTransportLevel="true"
 maxMessagesToLog="3000"
  maxSizeOfMessageToLog="2147483647"
 />

    </diagnostics>

    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
                <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
            </behavior>
            <behavior name="">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
                <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>

    <bindings>
        <basicHttpBinding>
            <binding name="ServicesBinding" maxBufferSize="2147483647" maxBufferPoolSize="2147483647"
             maxReceivedMessageSize="2147483647">
                <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                 maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
            </binding>
        </basicHttpBinding>
    </bindings>


    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
        <service behaviorConfiguration="ServiceBehavior" name="SUS.Web.Services.BaseService">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="ServicesBinding"
             contract="SUS.Web.Services.BaseService" />
        </service>
        <service behaviorConfiguration="ServiceBehavior" name="SUS.Web.Services.NuggetServices">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="ServicesBinding"
             contract="SUS.Web.Services.NuggetServices" />
        </service>
        <service behaviorConfiguration="ServiceBehavior" name="SUS.Web.Services.WorkspaceServices">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="ServicesBinding"
             contract="SUS.Web.Services.WorkspaceServices" />
        </service>
        <service behaviorConfiguration="ServiceBehavior" name="SUS.Web.Services.GeneralTemplateService">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="ServicesBinding"
             contract="SUS.Web.Services.GeneralTemplateService" />
        </service>
        <service behaviorConfiguration="ServiceBehavior" name="SUS.Web.Services.QueryService">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="ServicesBinding"
             contract="SUS.Web.Services.QueryService" />

        </service>
    </services>
</system.serviceModel>        

サーバーと Silverlight プロジェクトの間でアセンブリを共有しているので、それらの間でクラスを送信できます。サーバーは 250 個のオブジェクトを生成します。最大167個まとめて発送できます。これらの 250 個の VmNugget オブジェクトから任意の 167 個の VmNugget オブジェクトを選択できます。具体的なオブジェクトの問題ではありません。私のViewModelはかなり複雑で、互いに含めることができ、1つは別の祖先になることができます。MY クラスは [DataContract] および [DataMember] 属性で装飾されています。シリアル化中にプロセスを検査する方法のヒントはありますか? MY webService は次のように装飾されています。

[ServiceKnownType(typeof(VmCulture))]
[ServiceKnownType(typeof(VmNugget))]
[ServiceKnownType(typeof(VmDesignedNugget))]
[ServiceKnownType(typeof(VmDesigner))]
[ServiceKnownType(typeof(OperationLog))]
[ServiceKnownType(typeof(OperationLog))]
[ServiceKnownType(typeof(VmFile))]
[ServiceKnownType(typeof(VmQuery))]
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class QueryService : BaseService

興味深いこと:

次のようなプロパティからすべてのコンストラクターを削除しました。

private ObservableCollection<VmNugget> my;
[DataMember]
public ObservableCollection<VmNugget> My
get{
/* commented
if (this.my == null)
 this.my = new ObservableCollection<VmNugget>();
*/ 
return this.my;
}

返されたコレクションに 167 個を超える空のオブジェクトを配置しようとしましたが、それらをシリアル化してクライアントに送信することはできません。これらのオブジェクトは空 (初期化されていない) である必要があります。

Rows プロパティに OBservableCollection を持つ VmQuery クラスを使用して送信しています。

どうもありがとうございました。

トーマス

4

3 に答える 3

2

My ViewModels are pretty complex, can contain each other and one can be ancestor of another one.

これはおそらくあなたの問題があるところです。オブジェクト間に循環参照があり、シリアライザーがオーバーフローしていると思われます。これを確認する 1 つの方法は、各オブジェクト (およびその子オブジェクト) を一度に 1 つずつシリアル化することです。そのうちの 1 つ (またはそれ以上) が、あなたが説明した動作を示すと思います。

完全なオブジェクト自体ではなく、ID によって子オブジェクトへの参照をシリアル化することを検討してください。

于 2013-10-02T08:58:05.097 に答える
0

どうもありがとうございます。やっと見つけました。1 つのプロパティで、OBservableCollection の子孫を使用しました。このクラスは、含まれている各オブジェクトに親コレクションへの参照を記憶する素晴らしい機能を追加しています。:-) 解決し、私はまだ生きています。世界はとてもきれいです。

于 2013-10-02T11:08:39.360 に答える
0

無限ループまたは無限再帰がないことを確認してください。メソッド呼び出しが多すぎる場合は、多くの場合、再帰が非常に深いか無制限であることを示しています。

MSDN

于 2013-10-02T08:45:30.343 に答える