【问题标题】:ASP.NET How To Stream File To UserASP.NET 如何将文件流式传输给用户
【发布时间】:2010-10-18 16:32:23
【问题描述】:

最初我试图弄清楚 Response.Close 和 Response.End 之间有什么区别,但是在进行了更多的谷歌搜索和研究之后,很明显我还没有看到 Byte[] 被发送回的常见方式客户端。我将在下面留下代码示例,但我想知道这样做的行业标准是什么。

Byte[] myBytes = GetReportBytes();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.AppendHeader("content-length", myBytes.Length.ToString());
HttpContext.Current.Response.AppendHeader("content-Disposition", "attachment;filename=" + this.ReportFileName + GetReportExtension());
HttpContext.Current.Response.ContentType = GetApplicationContentType();
HttpContext.Current.Response.BinaryWrite(myBytes);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.Close();
//CERT FIX
//HttpContext.Current.Response.End();

【问题讨论】:

    标签: c# asp.net download httpresponse


    【解决方案1】:

    我不会打电话给Response.Close()Response.End()

    Response.End() 将在此时停止页面执行/渲染。 Response.End() 后面的代码不会运行。响应在该点终止,没有进一步的输出添加到流中。

    Response.Close() 类似于Response.End(),但允许在调用后执行代码(但不能在页面响应中发送进一步的输出)。

    Response.Flush() 会将所有剩余的响应项发送到页面。

    来自IIS core team member

    Response.Close 向 客户端并在任何地方使用它 除了错误情况会导致 各种问题 - 例如,如果你 正在与足够多的客户交谈 延迟,复位数据包可能会导致 缓冲的任何其他响应数据 服务器、客户端或某处 之间被丢弃。

    在这种特殊情况下,压缩 包括寻找共同的模式 在响应和一定数量的 响应必须由 压缩代码以增加 找到更长重复的机会 模式 - 这部分被缓冲 一旦您无法发送给客户 做 Response.Close()。

    简而言之,不要使用 Response.Close()。

    【讨论】:

    • @Mitch - 我正在稍微改变这个问题,以便更多地了解如何流式传输。我并没有真正看到这方面的标准,我想从那里开始。
    • 那么在流式传输文件时不要调用 Response.Close() 或 Response.End() 吗?只需调用 Response.Flush() 将文件发送出缓冲区并结束该方法?
    • 有趣的是,在 MasterPage 的上下文中,如果您不调用 Response.Close()(或邪恶的 Response.End()),MasterPage 页脚会在您的内容之后写入
    猜你喜欢
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2015-11-29
    • 2013-09-23
    • 2023-02-23
    相关资源
    最近更新 更多