Услуги WCF возвращает неверную длину содержимого при использовании GZIP кодирования

У меня есть веб-страница, содержащая фильтрующее текстовое поле и ящик списка. Модификации текстового поля вызывают запрос AJAX, который возвращает массив значений, с которыми можно заполнить вставку списка.

У меня были проблемы с этими звонками иногда, зависящие от размера возвращаемых данных. Возвращенные данные небольшого размера приведут к ошибке, данные больших размеров были возвращены и выполнены успешно.

Эта проблема происходит только при использовании версии jQuery, превышающую 4,2. Если я использую jQuery версию 4.2, у меня нет проблем.


Вот код вызова:

        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);
                }
            }
             );

Вот содержимое отладочной консоли, если возвращены два элемента:

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

, но если один элемент возвращен:

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

Итак, конечно, мы получаем ошибку «неtermined String Constance».


Я сделал некоторое расследование, используя Fiddler.

На все ответы (даже успешные) Fiddler отображал ошибку:

Fiddler обнаружил нарушение протокола в сеансе № N1 .

Несоответствие длины содержимого: указанный заголовок ответа N2 байты, но Сервер отправлен N3 байты.

Если заголовок ответа указывает размер , больше , чем фактический размер, то результаты все еще могут интерпретировать браузер.

Если заголовок ответа указывает размер , меньше Фактический размер, то браузер не может интерпретировать результаты.

Очевидное предположение для того, чтобы сделать то, что код обработки ответов читает заголовок длиной содержимого и не читает больше данных, кроме которых предусмотрено длиной.

Следующий шаг в моем расследовании состоит в том, чтобы сравнить заголовки запроса / ответа для jQuery версии 1.6.1 (сломаются) и версии 1.4.2 (которая не нарушается).

jQuery 1.6.1 Запрос заголовка:

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 Заголовки ответов

 HTTP / 1.1 200 OK OK
Сервер: Server Server Asp.net / 10.0.0.0
Дата: пн, 12 сен 2011 23:02:36 GMT
X-ASPNET-версия: 4.0.30319
Кодировка контента: GZIP
Длина содержимого: 140
Cache-Control: Частный
Тип содержимого: приложение / JSON;  Charset = UTF-8
Соединение: Закрыть
 

И вот заголовок запроса при использовании jQuery 1.4.1. Обратите внимание, что в заголовке принять заголовок отличается от значения 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

И ответ вернулся на 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

Итак, очевидная разница состоит в том, что когда вызов сделан через jQuery 1.6.1 Ответ сжимается с использованием GZIP, и когда вызов сделан через jQuery 1.4.2 Ответ не сжимается.


Итак, теперь я могу сделать работу вокруг решения, который должен переопределить по умолчанию , принять заголовок, чтобы убедиться, что он не содержит строку "q=0.01". (Лучшее объяснение, которое я могу найти для "q=0.01" здесь , но я не понимаю, почему мою реализацию услуг интерпретирует это в качестве запроса на молчание.)

        // 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);
                }
            }
             );

Так что после всего этого следствия оставшийся вопрос заключается в том, почему существует неразъемность между заголовком длины содержимого и фактической длиной содержания, когда ответ имеет сжатие Gzip?

Я использую службу WCF с WCF с WebHTTPBINDING.

7
задан 17 revs 20 December 2011 в 22:20
поделиться