3

を受け入れることができるWCFサービスがありbyte[]ます。を使用してクライアントを作成していますHttpClientが、次のエラーが発生します。サーバーとクライアントの両方でを設定する必要があることをオンラインで読みましたがreaderQuotas、これらの設定を?で設定するにはどうすればよいHttpClientですか?

エラー:

タイプRTM.API.Resources.UGCRequestのオブジェクトの逆シリアル化中にエラーが発生しました。XMLデータの読み取り中に、配列の最大長クォータ(16384)またはオブジェクトグラフクォータの最大アイテムを超えました。これらのクォータは、XmlDictionaryReaderQuotasのMaxArrayLengthプロパティまたはMaxItemsInObjectGraph設定を変更することで増やすことができます。

サーバー構成:

    <standardEndpoints>
        <webHttpEndpoint>
            <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" maxBufferSize="2147483647"/>
            <standardEndpoint name="DirectoryEndpoint"/>
        </webHttpEndpoint>
    </standardEndpoints>
    <services>
        <service name="API.Service.UGCService" behaviorConfiguration="DataServiceBehavior">
            <endpoint contract="API.Service.UGCService" kind="webHttpEndpoint" endpointConfiguration="" binding="webHttpBinding" bindingConfiguration="BigHttpBinding"/>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="DataServiceBehavior">
                <serviceDebug includeExceptionDetailInFaults="true"/>
                <dataContractSerializer maxItemsInObjectGraph="2147483644"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <bindings>
        <webHttpBinding>
            <binding name="BigHttpBinding" transferMode="Buffered" maxReceivedMessageSize="2147483647" >
                <readerQuotas maxArrayLength="2147483647" maxDepth="2147483647" maxStringContentLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
            </binding>
        </webHttpBinding>
    </bindings>

クライアントコード:

using (HttpClient client = new HttpClient(apiPath))
            {
                using (HttpRequestMessage request = new HttpRequestMessage(method, finalUrl))
                {
                    request.Headers.Accept.AddString("application/json");
                    request.Headers.Add("Authorization", sb.ToString());

                    if (method == "POST" || method == "PUT")
                    {
                        if (requestBody.Count() == 0)
                            request.Headers.ContentLength = 0;
                        else
                        {
                            request.Content = HttpContent.Create(APM6.Utils.Serialize(requestBody), "application/json");
                        }
                    }

                    using (HttpResponseMessage response = client.Send(request))
                    {
                        return response.Content.ReadAsString();
                    }
                }
            }
4

3 に答える 3

3

readerQuotasは、サービス拒否(DOS)攻撃からの保護を提供するためにWCFが実装する追加の制約のセットです。

HttpClientはその保護を実装していないため、余分なクライアント構成について心配する必要はありません。

<readerQuotas maxArrayLength="2147483647" />何らかの理由でサーバーエンドポイントに適用されていないため、このエラーが表示されます。svcutil.exeまたはを使用してそれwcftestclient.exeを証明することができます。

これらのツールを使用して構成ファイルを生成してみてください。おそらく<readerQuotas maxArrayLength="16384" />その構成ファイルに表示されます。これは、サーバー部分が拡張値をに適用しなかったことを意味しますmaxArrayLength

それが当てはまる場合は、サーバー側の構成またはコードを試して、構成が適用されていることを確認してください。

于 2012-06-25T12:50:44.067 に答える
2

これを試して:

  <endpointBehaviors>
    <behavior name ="namespace1.namespace1Behavior">
      <dataContractSerializer maxItemsInObjectGraph ="2147483647"/>
    </behavior>
    <behavior name="mybehavior">
      <transactedBatching maxBatchSize="2147483647"/>
    </behavior>
  </endpointBehaviors>

  <serviceBehaviors>
    <behavior name="namespace1.namespace1Behavior">
      <dataContractSerializer maxItemsInObjectGraph ="2147483647"/>
      <!-- To avoid disclosing metadata information, 
      set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="True"/>
      <!-- To receive exception details in faults for debugging purposes, 
      set the value below to true.  Set to false before deployment 
      to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="True" />
    </behavior>
  </serviceBehaviors>
</behaviors>
于 2012-06-25T13:26:14.867 に答える
1

この場合、クライアントで必要な設定はMaxResponseContentBufferSize.

ただし、サーバーでの逆シリアル化中に問題が発生しました。maxBufferPoolSize="2147483647" maxBufferSize="2147483647"バインディングパラメーターとして追加する必要がある場合があります

これはまだエラー メッセージに完全に対応していないようです。サービスの動作が、別のコピーではなく、質問に示されている構成ファイルに対応していることを確認してください。

于 2012-06-20T20:50:43.083 に答える