【问题标题】:ASP.NET MVC: Download stream without freezingASP.NET MVC:下载流而不冻结
【发布时间】:2013-09-13 01:44:07
【问题描述】:

我们使用 ASP.NET MVC 4(演示)、WCF(逻辑)、Azure Blob 存储(存储)。

是否可以在不冻结网站导航的情况下实现流式下载(通过)?

我们确实需要“通过”,因为需要自定义标头(Content-Disposition 等)。这意味着 FilePathResult 和直接链接到 Azure 是不可能的。

现在下载是这样实现的:

[HttpGet]
public ActionResult DownloadTemplate(Guid templateId)
{
    Response.Clear(); Response.BufferOutput = false;

    DownloadResult result = Client.DownloadTemplate(templateId)

    Response.AddHeader("Content-Type", MimeHelper.GetMimeType(result.FileName));
    Response.AddHeader("Content-Disposition", "attachment; filename=" + result.FileName);

    byte[] buffer = new byte[4096]; int readed = 0;

    while ((readed = result.ContentStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        if (Response.IsClientConnected)
        {
            Response.OutputStream.Write(buffer, 0, readed);
            Response.Flush();
        }
    }

    return new EmptyResult();
} 

【问题讨论】:

  • 也许FileResult
  • 据我所知,FileResult 的所有后代都在缓冲输出并等待操作完成,似乎需要 IHttpHandler 或类似的东西,但我不明白 IHttpHandler 只能服务一个请求

标签: c# wcf asp.net-mvc-4 azure-blob-storage


【解决方案1】:

也许您的按钮应该在控制器中对您的网络方法进行 javascript ajax 调用..

【讨论】:

  • 你是怎么想象的?你能解释一下吗?
  • 修改相关按钮有一个onclick='$.get("url");'确保在生成视图时.. guid 位于 url 的末尾.. 直接指向您的方法。由于您在 MVC 中,因此您可以使用 JQuery..api.jquery.com/jQuery.get
  • $.get 的结果是 jqXHR 这意味着文件将被获取但它不可能从 javascript 保存到客户端文件系统
  • Ajax 请求的结果.. 假设您的响应中有正确的标头,应该会导致自动文件下载.. 到客户端的文件系统。不可能有任何其他行为。
  • 谢谢,通过添加代理休息文件服务解决。没有找到其他方法。
【解决方案2】:

通过在存储抽象和浏览器之间添加代理 WCF REST 文件服务解决。

【讨论】:

    猜你喜欢
    • 2016-10-15
    • 2019-01-14
    • 2016-01-05
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 2021-06-20
    • 2022-01-05
    相关资源
    最近更新 更多