当前位置: 首页 > 面试题库 >

使用gzip编码时,WCF服务返回不正确的Content-Length

丁高峯
2023-03-14
问题内容

我有一个网页,其中包含过滤文本框和列表框。修改文本框将触发AJAX请求,该请求将返回一个值数组,用于填充列表框。

这些调用有时会失败,这取决于返回的数据大小。返回的小尺寸数据将导致错误,大尺寸的数据已成功返回并进行了处理。

仅当我使用大于4.2的jQuery版本时,才会发生此问题。如果我使用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标头,并且读取的数据不超过长度规定的数据。

我调查的下一步是比较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
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进行调用时,响应将不会被压缩。

因此,现在我可以解决此问题,即覆盖默认的 Accept
标头,以确保其中不包含"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压缩后,为什么内容长度标头与实际内容长度之间存在差异?

我正在使用带有webHttpBinding的WCF服务。


问题答案:

首先-非常好的问题。这个问题为我提供了足够的信息,可以为我的问题找到解决方案。

我遇到了类似的问题,并在此处发布了此修复程序-以便对某人有所帮助。

  1. Ajax获取和发布请求在IE中返回null

  2. 在其余浏览器中运行正常,但是在提琴手中看到“响应标头指示n个字节,但服务器发送了nn个字节”消息以请求。

一个明显的假设是,响应处理代码读取Content-Length标头,并且不再读取任何数据

我也这么认为!

在这种情况下,我一件事很清楚。 某些东西在篡改请求/响应。 我尝试切换回旧版本的jQuery(如您的问题所述),但这没有帮助。

修复- 我打开了应用程序的Web配置,并通读了它。 模块中 包含来自telerik 的 “ RadCompression模块”
,删除该模块后一切正常。

RadCompression模块已知存在错误,并通过压缩Response导致多个问题。

如果您遇到类似的问题,请尝试检查可能拦截了您的请求/响应的内容。



 类似资料:
  • 问题内容: 我有这个应用程序,它可以在本地运行,并且在部署时可以使用.mdf SQL Express数据库文件(通常用于测试目的)。但是,当我将其更改为可与我们的SQL Server 2008一起使用时,该应用程序可以运行,但该服务无法运行。 例如,如果在页面后面的代码中,我有一个按钮可以向表中添加数据,例如: 我的web.config设置为在该服务器上使用模拟,并且一切运行良好。但是,对于我的服

  • 问题内容: 我正在使用接受json响应的jquery ajax调用: 在我的php后端函数中,我在一个简单的数组上使用json_encode,如下所示: 但是 alert(msg.hello) 为我返回 未定义 。这是怎么了?另外,在我的 console.log中, 我能够得到如下输出: 问题答案: 使用的返回数据:

  • 问题内容: 我正在编写一些代码来与尚不存在的服务接口,因此我正在编写一个模拟器,以尝试降低当我有机会与实际系统集成时可能遇到的一些问题的风险。该接口基本上是一个REST风格的接口,该接口返回JSON格式的字符串。 接口规范说,将返回JSON格式的响应来代替标准HTTP正文。它还说来自服务器的响应将被zlib压缩,并在标头中设置“ Content- Encoding:gzip”。因此,我创建了一个W

  • 我想将日期字符串从“2016-09-23T09:14:52.555000000”格式解析为“23-SEP-2016”格式。 这是我的密码: 问题是如果我用这句台词 SimpleDateFormat oracleDateFormat=新的SimpleDateFormat(“yyyy-MM-dd'T'kk:MM:ss.S”); 输出为(不正确的日期值): 而如果用这条线 oracleDateForma

  • 我使用泽西API进行我的REST服务。我的问题是:是否有更优雅的方式以JSON形式返回异常?最好是自己创建一个json对象并将其直接附加到响应中? 这是服务中一种方法的简化示例。如您所见,我使用HashMap只是因为该方法可能引发异常,在这种情况下,我需要返回有关它的信息。

  • 问题内容: 我正在尝试从WCF服务返回一些JSON。该服务仅从我的数据库返回一些内容。我可以得到数据。但是,我担心JSON的格式。当前,返回的JSON格式如下: 实际上,我希望JSON的格式尽可能整洁。我相信(我可能是不正确的),以干净的JSON表示的相同结果集应如下所示: 我不知道“ d”来自哪里。我也不知道为什么要插入转义字符。我的实体如下所示: 负责返回内容的服务定义为: 如何从WCF服务返