为什么在手动刷新响应时ASP.NET将使用Transfer-Encoding头替换Content-Length头?
|
我们的Web应用程序(ASP.NET Web窗体)有一个页面,将向用户显示最近生成的PDF文件。由于PDF文件有时相当大,所以我们实现了一种“流式”方式,以块形式发送给客户端浏览器。 尽管以块形式发送数据,但是在发送文件之前,我们知道文件的完整大小,因此我们正确设置了Content-Length标题。这已经在我们的生产环境中工作了一段时间(并且在我们的测试环境中继续使用几乎相同的配置),直到今天。报告的问题是Chrome将尝试打开PDF文件,但会挂起“加载”动画卡住。 因为一切在我们的测试环境中仍然能正常运行,所以我可以使用Firebug来查看在两个环境中回来的响应头。在测试环境中,我正在看到一个适当的“Content-Length”标题,而在生产中已经被Transfer-Encoding:chunked标题替换。 Chrome不喜欢这个,因此挂断了。 我已经阅读了一些文章和帖子,讨论了当没有提供Content-Length头部时,Transfer-Encoding头可以显示,但是我们指定了Content-Length头,并且所有内容仍然运行起来,同时运行相同的代码测试服务器上的相同PDF文件。 测试和生产服务器都运行IIS 7.5,并且都启用了动态和静态压缩。 以下是相关代码: var fileInfo = new FileInfo(fileToSendDown);
Response.ClearHeaders();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition","filename=test.pdf");
Response.AddHeader("Content-Length",fileInfo.Length.ToString());
var buffer = new byte[1024];
using (var fs = File.Open(file,FileMode.Open,FileAccess.Read,FileShare.Read))
{
int read;
while ((read = fs.Read(buffer,1024)) > 0)
{
if (!response.IsClientConnected) break;
Response.OutputStream.Write(buffer,read);
Response.Flush();
}
}
我很幸运地在我的本地工作站上看到了相同的行为,所以使用调试器我已经看到’Transfer-Encoding:chunked’标题被设置在第二遍通过while循环在调用“冲洗” 。在这一点上,响应既具有Content-Length头和Transfer-Encoding头,但是在响应到达浏览器的时候,Firebug只显示Transfer-Encoding头。 UPDATE 我想我已经跟踪了这一点,结合使用“chunks”中的数据发送,并在HttpResponse对象上附加一个“Filter”(我们使用一个过滤器跟踪被发送到每个页面的viewstate的大小) 。在将PDF发送到浏览器时,我们使用HTTP过滤器没有任何意义,因此清除过滤器已经解决了我们的问题。我决定深入挖掘一下,纯粹是出于好奇,并且如果任何人在未来绊倒这个问题,就会更新这个问题。 我在AppHarbor上有一个简单的应用程序,可以复制问题:http://transferencodingtest.apphb.com/.如果您同时检查“使用过滤器”?和“传送块”?你应该可以看到’transfer-encoding:chunked’标题显示(使用Chrome开发工具,Firebug,Fiddler,无论如何)。如果没有选中任何一个框,您将获得适当的内容长度标题。底层代码在github上,所以你可以看到幕后发生了什么: https://github.com/appakz/TransferEncodingTest 请注意,要在本地进行复制,您需要在IIS 7.5中设置本地网站(7也可以正常工作,我没有尝试过)。 Visual Studio附带的ASP .NET开发服务器不会重现此问题。 我已经在博客帖子中添加了更多的细节:‘Content-Length’ Header Replaced With ‘Transfer-Encoding: Chunked’ in ASP .NET 解决方法从 an article on MSDN起,您似乎可以禁用分块编码:appcmd set config /section:asp /enableChunkedEncoding:False 但是在ASP settings下提到,因此它可能不适用于从ASP.NET处理程序生成的响应。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – Gridview编辑,点击两次问题
- asp.net – RequiredFieldValidator在文本上放置display:i
- asp.net – 如何在.net WebApi2应用程序中使用OAuth2令牌请
- asp.net-mvc – 比ASP.NET MVC中的隐藏表单字段更安全吗?
- 身份验证 – 如何使用ASP.NET身份在Web API 2中实现双因素身
- 使用ASP.NET MVC和JQuery表单插件/文件上传检测IsAjaxReque
- asp.net – 有什么功能,将帮助我重构CSS
- asp.net-mvc – 在html.actionlink上单击转到上一页
- ASP.NET MVC:Action Filter设置控制器变量?
- asp.net-mvc – 如何渲染部分视图到字符串
- asp.net – KnockoutJS,在ajax调用后更新ViewMod
- asp.net – 将tracelistener添加到web.config
- asp.net-mvc – 为什么必须将LESS文件设置为Buil
- asp.net – 如何将两个模型传递给一个View
- asp.net-mvc – ASP.NET MVC图像和其他静态内容u
- 在IIS 7.5上运行ASP Classic
- asp.net – 一些黑客可以从用户窃取cookie,并在网
- asp.net-mvc-4 – 带有返回URL的注销链接(OAuth)
- asp.net-mvc-3 – 全球化在ASP.Net MVC 3
- asp.net-mvc – 防止在ASP.NET MVC中缓存属性,每
