0

このアプリは、basicHttpBinding を介して WCF 経由で多数の Web サービスを使用します。多くの場合、XML メッセージは非常に大きくなります (>2MB)。

実行時に、すでに Int32.MaxValue に設定されている ReaderQuotas に関連していると思われる逆シリアル化エラーを断続的に受け取ります。

スタックの先頭は次のとおりです (申し訳ありませんが、提供された画像から手動で入力する必要がありました)。

System.ServiceModel.Dispatcher.NetDispatcherFaultException: The formatter threw an 
exception while trying to deserializat the message: There was an error while trying to
deserialize parameter [the namespace]. 

The InnerException message was 'There was an error deserializing the object of type 
[a type]. The maximum array length quota (5) or the maximum items in object graph 
quota has been exceeded while reading XML data. These quotas may be increased by
changing the MaxArrayLength property on XmlDictionaryReaderQuotas or the 
MaxItemsInObjectGraph setting. Line 1, position 3645191.

クライアントは次のように構成されています。

<client>
      <endpoint address="http://someUri/someSvc" binding="basicHttpBinding" bindingConfiguration="SomeSvcBindingConfiguration" contract="SomeSvc" name="SomeSvc" behaviorConfiguration="ClientObjectBehavior" />
</client>

<behaviors>
      <endpointBehaviors>
        <behavior name="ClientObjectBehavior">
          <dataContractSerializer maxItemsInObjectGraph="131072"  />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <bindings>
      <basicHttpBinding>
        <binding name="SomeSvcBindingConfiguration" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:00:15" sendTimeout="00:00:15" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="10485760" maxBufferPoolSize="524288" maxReceivedMessageSize="10485760" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="false">
          <readerQuotas maxDepth="2147483647"
                              maxStringContentLength="2147483647"
                              maxArrayLength="2147483647"
                              maxBytesPerRead="2147483647"
                              maxNameTableCharCount="2147483647" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>

...

この例外がまだ発生している理由を誰かが提案できますか?

カスタム設定の同等の組み合わせでない限り、basicHttpBinding からバインディングを変更する機能はありません。

4

1 に答える 1

0

例外メッセージに示されている数値 (「(5)」) は、実際には MaxArrayLength 設定の実行中の値です。なぜこの場合は 5 なのか、これ以上詳しく説明しないと判断できません。

ただし、グラフに最大 131072 個のオブジェクトしかないのは小さすぎる可能性があります (maxItemsInObjectGraph="131072"設定)。エラーは xml コンテンツの 3645191 の位置で発生するため、その xml 内には 131072 よりも多くのオブジェクトが存在する可能性があると思います。

于 2013-03-13T01:47:17.953 に答える