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

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

文件的平均大小为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相关问答推荐

如何格式化搜索字符串以从 Razor 页表中的多个列返回部分搜索字符串?

如何从 ASP.NET 中的代码隐藏文件访问 IFRAME?

如何以编程方式设置单元格 colored颜色 epplus?

如何在 GridView 单元格中的(即
)中呈现解码的 HTML

取消选中时 ASP.NET CheckBox 不会触发 CheckedChanged 事件

ASP.NET Response.Redirect 使用 302 而不是 301

使用 C# 和 ASP.NET 从 Gmail/Hotmail/Yahoo 导入通讯簿

在控制器 asp.net mvc 5 的视图上显示错误消息

如何在 ASP.NET 应用程序中使用 jQuery 捕获提交事件?

使用 JavaScript 禁用 ASP.NET 验证器

AddDefaultTokenProviders:它是什么以及如何使用那些默认提供者?

在生产中使用 LocalDb 是否正常?

DropDownList AppendDataBoundItems(第一项为空白且无重复项)

InvalidOperationException:无法为角色创建 DbSet,因为此类型未包含在上下文模型中

如何将参数传递给 ASP.NET MVC 2 中的自定义 ActionFilter?

如何将我的 DDD 模型中的用户与身份验证用户集成?

ASP.NET - 从静态方法/静态类访问会话?

将 HTML 字符串转换为图像

获取 POST 变量

jQuery Ajax 调用 - 成功设置变量值