2012-02-02 40 views
10

Llamo a mi servicio web WCF usando jQuery $ .ajax json POST.

Uno de los parámetros de entrada es muy largo, más de 8000 bytes. Los datos que contiene son una lista de GUID separados por comas, como este "78dace54-1eea-4b31-8a43-dcd01e172d14, ce485e64-e7c6-481c-a424-2624371180aa, ede4c606-f743-4e0a-a8cc-59bcffa7feda, f0a81ed1-80db- 4f6d-92d7-2fc47759a409 ".

Cuando ese parámetro es 8176 bytes largo, la solicitud sucede. Cuando es (una coma más y GUID) - la solicitud falla.

No funciona desde el navegador y desde Fiddler (proxy de depuración HTTP). he añadido esto a la configuración de servicio web:Límite de tamaño de parámetro JSON

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

Eso no hace ninguna diferencia, la solicitud todavía falla de parámetros de entrada más de 8176 bytes de longitud.
Ese parámetro de entrada se mapea en una Cadena en el lado WCF.
¿Qué me estoy perdiendo? ¡Gracias!

UPDATE, esto solucionó mi problema: Resulta que esta configuración controla el JSON mensaje de longitud total

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

Hay otra configuración que controla la longitud máxima de los parámetros individuales:

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

también , asegúrese de configurar esto:

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

Espero que esto solucione algunos dolores de cabeza.

+0

¿Ha intentado que esa lista de GUID se pase como una matriz JSON? –

+0

IMO podría ser un [elemento del navegador] (http://bytes.com/topic/javascript/answers/92088-max-allowed-length-javascript-string). –

+0

Cuando la solicitud tuvo éxito, ¿cuál fue el tamaño real de la solicitud/respuesta http que se ve en Fiddler? –

Respuesta

2

El límite real parece ser de 8192 bytes.

Usted tiene que comprobar su Web.config en la etiqueta 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> 

necesita cambiar MaxStringContentLength = "8192" a un valor mayor.

También puede realizar varias solicitudes en lugar de una para obtener la lista de GUID página por página, utilizando un parámetro de desplazamiento en cada solicitud. Por ejemplo, para obtener una lista de GUID por páginas de 200, primero solicite con desplazamiento = 0, segundo con desplazamiento = 200, ... hasta que obtenga menos de 200 elementos.

1

Sé que no será de mucha ayuda para usted, pero me gustaría señalar que la especificación JSON no establece ningún límite; Sin embargo, permite que los analizadores de hacerlo:

Una implementación puede establecer límites en el tamaño de los textos que
acepta. Una implementación puede establecer límites en la profundidad máxima de
anidando. Una implementación puede establecer límites en el rango de números.
Una implementación puede establecer límites en la longitud y contenido de los caracteres de cadenas.

RFC4627: The application/json Media Type for JavaScript Object Notation (JSON)

Ver si this answer se aplica a usted.

Cuestiones relacionadas