Предел размера параметра 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)
Смотрите, если этот ответ применим к вам.