Предел размера параметра JSON

Я вызываю свой веб-сервис WCF с помощью jQuery $.ajax json POST.

Один из входных параметров очень длинный - более 8000 байт. Данные в нем представляют собой список идентификаторов GUID, разделенных запятыми, например "78dace54-1eea-4b31-8a43-dcd01e172d14, ce485e64-e7c6-481c-a424-2624371180aa, ede4c606-f743-4e0a-a8cc-59bcffa7feda, f0a81ed1-80db- 4f6d-92d7-2fc47759a409".

Если этот параметр длиннее 8176 байтов, запрос выполняется. Когда он 8213 (еще одна запятая и GUID) - запрос не работает.

Он не работает в браузере и от Fiddler (HTTP-отладочный прокси). Я добавил это в конфигурацию webservice:

<configuration>
<system.web.extensions>
    <scripting>
        <webServices>
            <jsonSerialization maxJsonLength="50000000" recursionLimit="50000"/>
        </webServices>
    </scripting>
</system.web.extensions>

Это не имеет никакого значения, запрос все еще терпит неудачу для входного параметра более 8176 байтов.
Этот входной параметр преобразуется в строку со стороны WCF.
Что мне не хватает? Спасибо!

UPDATE, это решило мою проблему: Оказывается, эта настройка управляет общей длиной сообщения JSON

<webServices>
     <jsonSerialization maxJsonLength="50000000" recursionLimit="50000"/>
</webServices>

Существует еще одна настройка, которая контролирует максимальную длину для отдельных параметров:

<bindings>
  <webHttpBinding>
    <binding name="Binding_Name" maxReceivedMessageSize="900000">
      <readerQuotas maxDepth="32" maxStringContentLength="900000" maxBytesPerRead="900000" maxArrayLength="120000" maxNameTableCharCount="120000"/>
    </binding>
  </webHttpBinding>
</bindings>

Кроме того, не забудьте установить это:

  <system.web>
     <httpRuntime maxRequestLength="900000"/>

Надеюсь, что это позаботится о некоторых головных болях!

Ответ 1

Фактический предел составляет 8192 байта.

Вы должны проверить свой Web.config в теге system.serviceModel:

 <system.serviceModel>
  <bindings>
   <basicHttpBinding>
     <binding name="Service1Soap" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
     <security mode="None">
      <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
      <message clientCredentialType="UserName" algorithmSuite="Default"/>
     </security>
    </binding>
   </basicHttpBinding>
  </bindings>

Вам нужно изменить maxStringContentLength = "8192" на большее значение.

Вы также можете сделать несколько запросов вместо одного, чтобы получить список GUID по страницам, используя параметр смещения в каждом запросе. Например, чтобы получить список GUID по страницам 200, первый запрос со смещением = 0, второй с offset = 200,... пока вы не получите менее 200 элементов.

Ответ 2

Я знаю, что это не поможет вам, но я хотел бы указать, что спецификация JSON не устанавливает никаких ограничений; однако он позволяет синтаксическим анализаторам делать это:

Реализация может устанавливать ограничения на размер текста, который он/ принимает. Реализация может устанавливать ограничения на максимальную глубину вложенности. Реализация может устанавливать ограничения на диапазон чисел.
Реализация может устанавливать ограничения на длину и содержание символов строк.

RFC4627: Тип приложения /json Media для нотации объектов JavaScript (JSON)

Смотрите, если этот ответ применим к вам.