Pregunta

Tengo una página web que contiene un cuadro de texto de filtrado y un cuadro de lista. Las modificaciones en el cuadro de texto activan una solicitud AJAX, que devuelve una matriz de valores para llenar el cuadro de lista.

A veces tuve problemas con estas llamadas, dependiendo del tamaño de los datos devueltos. Los datos devueltos de tamaño pequeño resultarían en un error, los datos de gran tamaño se devolvieron y se procesaron con éxito.

Este problema solo ocurre cuando uso una versión jQuery superior a 4.2. Si uso jQuery versión 4.2, no tengo el problema.


Aquí está el código de la llamada:

        jQuery.ajax(
            {
                cache: false,
                url: "../Services/CmsWebService.svc/GetAvailableVideosForCompany",
                type: "GET",
                complete: function (jqXHR, textStatus) {
                    var responseText = jqXHR.responseText;
                    jQuery('#debugConsole').text(responseText);
                    availableVideosPopulationState.isRunning = false;
                    setTimeout(populateAvailableVideosListBox, 100);
                },
                data: { "companyIdString": queryParameters.companyIdField,
                    "textFilter": queryParameters.filterText
                },
                dataType: 'json',
                error: function (jqXHR, textStatus, errorThrown) {
                    var errorString = 'Error thrown from ajax call: ' + textStatus + 'Error: ' + errorThrown;
                    alert(errorString);
                },
                success: function (data, textStatus, jqXHR) {
                    populateVideoListFromAjaxResults(data);
                }
            }
             );

Aquí está el contenido de la consola de depuración si se devuelven dos elementos:

{"d":[{"__type":"ListEntry:#WebsitePresentationLayer","Text":"SOJACKACT0310DSN1.mpg - [SOJACKACT0310DSN1]","Value":"5565_5565"},{"__type":"ListEntry:#WebsitePresentationLayer","Text":"SOJACKACT0310DSN1Q.mpg - [SOJACKACT0310DSN1Q]","Value":"5566_5566"}]}

Pero si se devuelve un elemento:

{"d":[{"__type":"

Entonces, por supuesto, obtenemos un error de "constante de cadena no terminado".


He hecho alguna investigación usando Fiddler.

En todas las respuestas (incluso las exitosas), Fiddler mostró un error:

Fiddler ha detectado una violación de protocolo en la sesión #N1.

Desempeño de longitud de contenido: encabezado de respuesta indicado N2 bytes, pero el servidor enviado N3 bytes.

Si el encabezado de respuesta indica un tamaño mas grande que que el tamaño real, entonces los resultados aún podrían ser interpretados por el navegador.

Si el encabezado de respuesta indica un tamaño menos que El tamaño real, entonces el navegador no pudo interpretar los resultados.

La suposición obvia de hacer allí es que el código de manejo de la respuesta lee el Content-Length encabezado y no lee más datos que los estipulados en la longitud.

El siguiente paso en mi investigación es comparar los encabezados de solicitud/respuesta para jQuery versión 1.6.1 (que se rompe) y la versión 1.4.2 (que no se rompe).

JQuery 1.6.1 encabezado de solicitud:

GET /Web/Services/CmsWebService.svc/GetAvailableVideosForCompany?companyIdString=2&textFilter=3DSBDL2&_=1315869366142 HTTP/1.1
X-Requested-With: XMLHttpRequest
Accept: application/json, text/javascript, */*; q=0.01
Referer: http://localhost:52200/Web/Admin/PlayerGroupEditor.aspx?groupid=76
Accept-Language: en-au
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
Host: localhost:52200
Connection: Keep-Alive
Cookie: .ASPXAUTH=CE853BBD860F40F0026400610074006D006500640069006100310000002B5387799D71CC01002B5B5D62C771CC0100002F0000006B119589A7305098A560E57515498C56ECB332035F300427CDA2B28205D5E6B6

JQuery 1.6.1 encabezados de respuesta

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 12 Sep 2011 23:02:36 GMT
X-AspNet-Version: 4.0.30319
Content-Encoding: gzip
Content-Length: 140
Cache-Control: private
Content-Type: application/json; charset=utf-8
Connection: Close

Y aquí está el encabezado de solicitud cuando uso jQuery 1.4.1. Observe que el Accept El encabezado es diferente del valor jQuery 1.6.1.

GET /Web/Services/CmsWebService.svc/GetAvailableVideosForCompany?_=1315870305531&companyIdString=2&textFilter=3DSBDL2 HTTP/1.1
Referer: http://localhost:52200/Web/Admin/PlayerGroupEditor.aspx?groupid=76
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Accept: application/json, text/javascript, */*
Accept-Language: en-au
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
Host: localhost:52200
Connection: Keep-Alive
Cookie: .ASPXAUTH=CE853BBD860F40F0026400610074006D006500640069006100310000002B5387799D71CC01002B5B5D62C771CC0100002F0000006B119589A7305098A560E57515498C56ECB332035F300427CDA2B28205D5E6B6

Y la respuesta a jQuery 4.1.1:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 12 Sep 2011 23:31:46 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 131
Cache-Control: private
Content-Type: application/json; charset=utf-8
Connection: Close

Entonces, la diferencia obvia es que cuando la llamada se realiza a través de jQuery 1.6.1, la respuesta se comprime usando GZIP, y cuando la llamada se realiza a través de jQuery 1.4.2 La respuesta no se comprime.


Así que ahora puedo hacer una solución de trabajo, que es anular el valor predeterminado Aceptar encabezado para asegurarse de que no contenga el "q=0.01" cuerda. (La mejor explicación que puedo encontrar para "q=0.01" es aquí, pero no veo por qué la implementación de mi servicio está interpretando esto como una solicitud para ampliar la respuesta).

        // Make the AJAX call, passing in the company id and the filter string
        jQuery.ajax(
            {
                accepts: 'application/json, text/javascript, */*',
                cache: false,
                url: "../Services/CmsWebService.svc/GetAvailableVideosForCompany",
                type: "GET",
                complete: function (jqXHR, textStatus) {
                    var responseText = jqXHR.responseText;
                    jQuery('#debugConsole').text(responseText);
                    availableVideosPopulationState.isRunning = false;
                    setTimeout(populateAvailableVideosListBox, 100);
                },
                data: { "companyIdString": queryParameters.companyIdField,
                    "textFilter": queryParameters.filterText
                },
                dataType: 'json',
                error: function (jqXHR, textStatus, errorThrown) {
                    var errorString = 'Error thrown from ajax call: ' + textStatus + 'Error: ' + errorThrown;
                    alert(errorString);
                },
                success: function (data, textStatus, jqXHR) {
                    populateVideoListFromAjaxResults(data);
                }
            }
             );

Entonces, después de toda esta investigación, la pregunta restante es ¿por qué hay una disparidad entre el encabezado de longitud de contenido y la longitud real del contenido cuando la respuesta se comprime GZIP?

Estoy usando un servicio WCF con WebHTTPBinding.

¿Fue útil?

Solución

Primero de todo, muy buena pregunta. Esta pregunta me proporcionó suficiente información para llegar a una solución para mi problema.

Tuve un problema similar y publiqué la solución aquí, para que pudiera ayudar a alguien.

  1. Las solicitudes de Ajax Get & Post regresaban nulas en IE

  2. Estaba funcionando bien en el resto de los navegadores, pero vio el encabezado de respuesta indicado n bytes, pero el servidor envió el mensaje de nn bytes en fiddler para la solicitud.

La suposición obvia de hacer allí es que el código de manejo de la respuesta lee el encabezado de longitud de contenido y no lee más datos

¡Creo que también!

En este caso, tenía claro una cosa. Algo manipulaba la solicitud/respuesta.Intenté volver a la versión anterior de jQuery (como se mencionó en su pregunta), pero eso no ayudó.

Arreglar-Abrí la configuración web de mi aplicación y la leí. Hubo un 'Módulo RadCompression' de Telerik incluido en los módulos, y al eliminarlo todo comenzó a funcionar bien.

Se sabe que el módulo de RadCompresión es erróneo y causa múltiples problemas al comprimir la respuesta.

Si tiene problemas similares, intente verificar lo que podría interceptar su solicitud/respuesta.

Otros consejos

Response Header indicated 140 bytes, but server sent 254 bytes dice mucho. ¿Sucede lo mismo independientemente del navegador que usa? Si es así, podemos decir que IE o JQuery 1.4.3 y más en IE no leen bytes después de leer tantos bytes como se especifica en el encabezado de respuesta, mientras que otros navegadores leen todo el contenido de todos modos.

También es posible (sin embargo, apenas creo que esto) el encabezado de respuesta se forme erróneamente solo para las solicitudes de IE. Luego debe observar las diferencias entre IE y otras solicitudes de navegador y su código de servicio. ¿Quizás sus servicios manejan las solicitudes de IE específicamente?

Sería interesante calcular cuánto bytes hay después de la última cita capturada (") en tu cadena JSON. 114 tal vez?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top