3

GET 経由で REST 呼び出しを受け取り、JSON を返す自己ホスト型 (IIS にはない) WCF データ サービスを使用しています。

3800 件のレコードを返すことができますが、3900 件になると失敗します。WCF または .NET からエラーまたは警告イベントが発生しなければ、アプリケーションは新しい要求に対して完全に実行され続けます。結果を静かに破棄し、データを JSON にシリアライズしません。

3800 レコードの戻り値は次のとおりです。

HTTP/1.1 200 OK
Content-Length: 1958039
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Access-Control-Allow-Origin: *
Date: Thu, 07 Jun 2012 14:28:39 GMT

{"カウント":3800,"結果":[{"bbox":"18.57544760000000,- .......

これはサービス契約です:

    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json)]
    CatalogResults SearchBoxADO(string requestBox);

デバッガーでは、SearchBoxADO は 3900 レコードで問題なく返されますが、シリアル化されておらず、HTTP 応答は生成されません (Fiddler は要求に対する応答がないと言っています)。

4

3 に答える 3

1

WCF フレームワークによる既定の設定です。WCF REST サービスからより大きなデータ セットを取得するには、クライアント側とサーバー側の両方で以下に示すように、readerQuotas を増やす必要があります。

<binding maxBufferPoolSize="655360" maxReceivedMessageSize="655360">
         <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
              maxArrayLength="2147483647" maxBytesPerRead="2147483647"
              maxNameTableCharCount="2147483647" />
        <security mode="None" />
      </binding>

以下に示すように、maxItemsInObjectGraph を大きな値に設定することも検討してください。

<behavior>
    <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    <serviceMetadata httpGetEnabled="true" />
    <serviceDebug includeExceptionDetailInFaults="false" />
</behavior>

以下に示すように、コードを介して上記を実現できます。

コードを介してすべてを構成しているため、以下に示すように、コードを使用して readerQuotas を定義することもできます。

Binding binding = new WebHttpBinding();
binding.MaxBufferSize = 2147483647;
binding.MaxReceivedMessageSize = 2147483647;

var myReaderQuotas = new XmlDictionaryReaderQuotas();
myReaderQuotas.MaxStringContentLength = 2147483647;
myReaderQuotas.MaxDepth = 2147483647;
myReaderQuotas.MaxArrayLength = 2147483647;
myReaderQuotas.MaxBytesPerRead = 2147483647;
myReaderQuotas.MaxNameTableCharCount = 2147483647;
binding.GetType().GetProperty("ReaderQuotas").SetValue(binding, myReaderQuotas, null); 

ブラウザでデータを取得しようとしている場合、クライアントとして .NET アプリを使用している場合は、サーバーに指定されているのと同じ readerQuotas を定義する必要があると思います。

以下に示すように、クラスに ServiceBehavior 属性を追加することにより、コードを介して maxItemsInObjectGraph を設定できます。

[ServiceContract]
[ServiceBehavior(MaxItemsInObjectGraph = 2147483647)]
public class Test
{
    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json)]
    CatalogResults SearchBoxADO(string requestBox);
}
于 2012-06-08T09:35:01.000 に答える
0

これは、ReaderQuotasのmaxBufferSize、maxBufferPoolSize、maxStringContentLength属性など、コンテンツのサイズに関連するいくつかのバインディング設定が原因で発生する可能性があります。

その設定を確認してみてください

于 2012-06-07T16:24:45.173 に答える
0

Depending on how many items are in each record being serialized, you may be running up against the default limit for the maxItemsInObjectGraph attribute of the dataContractSerializer. This MSDN article discusses the property, but it does contain an error. The default value is 65536 instead of Int32.MaxValue.

于 2012-06-07T16:31:52.210 に答える