Служба 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":"

Поэтому, конечно, мы получаем ошибку «Unterminated String Constant».

Я провел некоторое расследование с использованием скрипача.

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

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

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

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

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

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

Следующий шаг в моем исследовании - сравнить заголовки запроса / ответа для версии 1.6.1 jQuery (которая ломается) и версии 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
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

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

Ответы на вопрос(2)

Ваш ответ на вопрос