我不寻找任何替代的流媒体文件内容从

我有一个处理程序,在那里我必须交付大文件给客户的请求.我面临着以下问题,

文件的平均大小为4到100 MB,所以让我们考虑80MB文件下载情况.

Buffering On, Slow Start

Response.BufferOutput = True;

这会导致文件启动非常缓慢,因为用户下载,甚至进度条直到几秒钟(通常为3到20秒)才会出现,原因是,IIS首先读取整个文件,确定内容长度,然后开始文件传输.文件在视频播放器中播放,运行速度非常慢,但iPad只会先下载部分文件,所以运行速度很快.

Buffering Off, No Content-Length, Fast Start, No Progress

Reponse.BufferOutput = False;

这会导致即时启动,但终端客户端(典型的浏览器,如Chrome)不知道内容长度,因为IIS也不知道,所以它不会显示进度,而是显示下载的X KB.

Buffering Off, Manual Content-Length, Fast Start, Progress and Protocol Violation

Response.BufferOutput = False;
Response.AddHeader("Content-Length", file.Length);

这会导致在Chrome等浏览器中立即正确下载文件,但在某些情况下,IIS处理程序会导致"远程客户端关闭连接"错误(这是非常常见的),而其他WebClient会导致协议冲突.This happens 5 to 10% of all requests, not every requests.

我猜发生的情况是,当我们不进行缓冲时,IIS不会发送任何名为100 Continue的内容,并且客户端可能会在不期望任何输出的情况下断开连接.然而,从源读取文件可能需要更长的时间,但在客户端,我增加了超时,但看起来像IIS超时,并且无法控制.

我是否可以强制回复发送100继续,不让任何人关闭连接?

UPDATE

我在Firefox/Chrome中发现了以下标题,对于违反协议或错误的标题,这里似乎没有什么不寻常的.

Access-Control-Allow-Headers:*
Access-Control-Allow-Methods:POST, GET, OPTIONS
Access-Control-Allow-Origin:*
Access-Control-Max-Age:1728000
Cache-Control:private
Content-Disposition:attachment; filename="24.jpg"
Content-Length:22355
Content-Type:image/pjpeg
Date:Wed, 07 Mar 2012 13:40:26 GMT
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

UPDATE 2

转向回收仍然没有提供太多,但是我已经将我的MaxWorkerProcess增加到8,并且我现在得到的错误数量比以前少了.

但平均而言,在一秒内的200个请求中,有2到10个请求失败.这种情况几乎每隔一秒就会发生一次.

UPDATE 3

继续有5%的请求失败并显示"服务器违反了协议.节=ResponseStatusLine",我有另一个程序从使用WebClient的Web服务器下载内容,这给出了这个错误每秒4-5次,平均有5%的请求失败.是否有任何方法可以跟踪WebClient故障?

Problems Redefined

Zero Byte File Received

IIS由于某种原因关闭了连接,在WebConfig的客户端,我收到的文件是0字节,不是0字节,我们做了SHA1散列判断,这告诉我们在IIS Web服务器中,没有记录错误.

这是我的错误,当我们使用实体框架时,它被解决了,因为读取不在事务范围内,所以它正在读取脏的(未提交的行),把它放在事务范围内解决了这个问题.

Protocol Violation Exception Raised

WebClient抛出WebException,说"服务器违反了协议.Section=ResponseStatusLine.

我知道我可以启用不安全的报头解析,但这不是重点,当是我的HTTP处理程序发送正确的报头时,我不知道为什么IIS会发送任何额外的东西(在Firefox和Chrome上判断,没有什么异常),这种情况只会发生2%的情况.

UPDATE 4

发现sc-Win32 64错误,我在某处读到MinBytesPerSecond的WebLimits必须从240更改为0,但一切仍然相同.但是,我注意到,每当IIS记录64个sc-win32错误时,IIS都会将HTTP状态记录为200,但是出现了一些错误.现在我不能打开200的失败跟踪日志(log)记录,因为它会导致大量文件.

以上两个问题都通过增加MinBytesPerSecond和禁用会话得到了解决,我添加了详细的答案,总结了每一点.

推荐答案

虽然在IIS中传递大文件的正确方式是以下选项,

  1. 在WebLimits中将MinBytesPerSecond设置为零(这肯定会有助于提高性能,因为IIS Select 通过较小大小的传输关闭保持KeepAlive连接的客户端)
  2. 分配更多的工作进程到应用程序池,我已经设置为8,现在只有当您的服务器分发更大的文件时才应该这样做.这肯定会导致其他站点的运行速度变慢,但这将确保更好的交付.我们已经设置为8,因为此服务器只有一个网站,并且它只提供巨大的文件.
  3. 关闭应用程序池回收
  4. 关闭会话
  5. 使缓冲处于打开状态
  6. 在执行以下每个步骤之前,请判断响应是否正确.IsClientConnected是真的,否则放弃,不要发送任何东西.
  7. 在发送文件之前设置内容长度
  8. 刷新响应
  9. 写入输出流,并定期刷新

Asp.net相关问答推荐

C# - 将 xyz 平铺转换为纬度/经度,反之亦然,给出不同的结果

web.config 部分的单独配置文件

ASP.NET 如何将控件呈现为 HTML?

如何确定 web.config 中的编译 debug="true"

是否有用于 Asp.net 标记的#IF DEBUG?

每月的每一天

在 IIS 上托管 ASP.NET 5 项目

部署后网站需要强制刷新

ASP.Net:在共享/静态函数中使用 System.Web.UI.Control.ResolveUrl()

无法确定条件表达式的类型,因为 'string' 和 'System.DBNull' 之间没有隐式转换

Razor 主机工厂错误

IIS 中的 existingResponse="PassThrough" 是什么意思?

asp.net 有控制台日志(log)吗?

用于呈现

VS2017 无法加载文件或程序集 Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll 或其依赖项之一

asp.net 网站上的第一页加载缓慢

我可以在 .NET Framework 4.0 上运行 MVC 5 应用程序吗?

如何调试 w3wp clr.dll 错误

Appdomain 回收究竟是什么

如何在asp.net的GridView中按列名而不是按索引获取单元格值