3

オブジェクトの大きなリストを返すメソッドがあります。いくつかのオブジェクト(10)を返すと、すべてがうまく機能します。問題は、100個のオブジェクトを返そうとしたときです。リストが非常に大きい理由は、リスト内のオブジェクトに他のオブジェクトが含まれているため、基本的にツリーを返すためです。

とにかく私は名前付きパイプを使用しています。これが私が使用しているエンポイントの構成です。

<netNamedPipeBinding>
      <binding name="NetNamedPipeBinding_ISymbolFileParser" 
                      closeTimeout="00:10:00"
                      openTimeout="00:10:00" 
                      receiveTimeout="00:10:00" 
                      sendTimeout="00:10:00"
                      transactionFlow="false" 
                      transferMode="Buffered" 
                      transactionProtocol="OleTransactions"
                      hostNameComparisonMode="StrongWildcard"
                      maxBufferPoolSize="2147483647"
                      maxBufferSize="2147483647" 
                      maxConnections="10" 
                      maxReceivedMessageSize="2147483647"
                     >
              <readerQuotas 
                   maxDepth="32" 
                   maxStringContentLength="2147483647" 
                   maxArrayLength="2147483647"
                   maxBytesPerRead="4096" 
                   maxNameTableCharCount="2147483647" />                    
      </binding>
</netNamedPipeBinding>

すべてを実行してオブジェクトの数を制限すると、うまく機能しresults.Take(10).ToArray();ます。100個のオブジェクトを返すと、例外が発生します。

ここに画像の説明を入力してください


問題を解決するために私がしたこと:

  1. 設定ファイルの番号を2147483647に増やします
  2. オブジェクトのリストを返す代わりに、サービス上で自分自身のリストをシリアル化し、リストの代わりにbyte[]を返すTestメソッドを作成しました。次に、クライアントでbyte []をリストに逆シリアル化し、それが機能します。したがって、これまでのところ、最悪の場合のシナリオは、オブジェクトを自分のセルフでシリアル化し、逆シリアル化する必要があるという解決策があります。

また、別のバインディングを使用する必要があるかどうかを尋ねる機会も利用したいと思います。共有メモリが最悪だと聞きましたが、wcfでそれを使用する方法がわかりません。同じマシン間で通信しているため、名前付きパイプを使用しています。

4

1 に答える 1

4

シリアル化の問題のようdataContractSerializer maxItemsInObjectGraphです。endpointBehaviorsとserviceBehaviorsの動作を増やしてみてください。

ここで同じ問題

于 2012-08-08T21:50:18.887 に答える