【问题标题】:ASP.NET Web API StreamContent - make browser show download progressASP.NET Web API StreamContent - 让浏览器显示下载进度
【发布时间】:2014-07-16 01:26:22
【问题描述】:

从 ASP.NET Web Api 2.x 控制器,我正在使用 StreamContent 类型的实例提供文件。当请求一个文件时,它的 blob 位于数据库中,并打开一个 blob 流。然后将 blob 流用作StreamContent 实例的输入。

归根结底,我的控制器动作类似于:

[HttpGet]
[Route("{blobId}")]
public HttpResponseMessage DownloadBlob(int blobId)
{
    // ... find the blob in DB and open the 'myBlobStream' based on the given id

    var result = new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new StreamContent(myBlobStream)
    };
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    result.Content.Headers.ContentLength = myBlobStream.Length;
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
        FileName = "foo.txt",
        Size = myBlobStream.Length
    };
    return result;
}

当我在 Chrome (v. 35) 中点击端点时,它说它正在解析主机 (localhost),当文件下载后,它会出现在下载栏中。但是,我想知道需要什么才能启用 Chrome(或任何其他浏览器)来显示下载进度?

我认为这可以通过包含诸如内容类型、内容长度和内容处置等标头信息来解决,但从我的尝试来看,这没有任何区别。

【问题讨论】:

    标签: c# asp.net browser stream asp.net-web-api2


    【解决方案1】:

    结果证明我的实现是正确的。我关闭了提琴手,一切都按预期工作。不知道提琴手在通过代理发送它之前是否以某种方式等待整个响应完成 - 至少,这可以解释为什么浏览器保持在“解析主机”状态,直到整个文件被下载。

    【讨论】:

    • Fiddler 默认缓冲请求和响应。要禁用它,您需要启用流式传输(工具栏中的流式传输按钮)
    • 你就是男人!!我为此苦苦挣扎了几天。然后意识到我有微服务中继,所以它会卡在解析主机直到下载完整文件。
    【解决方案2】:

    Web API 不会“推送”信息,因此,除非您的客户端上有一个后台线程每隔几秒左右轮询一次服务器的下载状态,否则这是个坏主意。实际上有很多原因:

    • 增加服务器负载以服务多个请求(想象一下,如果许多客户端同时执行此操作)
    • 增加来自您的客户的数据通信(如果您在手机合同中这样做,这将很重要)
    • 等。 (我敢肯定我能想到更多,但为时已晚)

    您可能需要为此考虑SignalR,尽管我不是这方面的专家。根据我链接的页面中的摘要:

    ASP.NET SignalR 是一个面向 ASP.NET 开发人员的新库,可以轻松开发实时 Web 功能。 SignalR 允许服务器和客户端之间的双向通信。服务器现在可以在内容可用时立即将内容推送到连接的客户端。 SignalR 支持 Web 套接字,并回退到旧浏览器的其他兼容技术。 SignalR 包括用于连接管理(例如,连接和断开事件)、连接分组和授权的 API。

    如果您的 Web API 允许,我想一个潜在的替代方案是首先发送一个快速的GET 请求以接收您将要下载的文件的大小并将其存储在您的客户端中。实际上,您可以在此处使用Content-Length 标头来避免额外的GET。然后进行文件下载,在下载过程中,您的客户端可以通过比较它收到的文件大小与从服务器获得的文件的完整大小来报告下载进度。

    【讨论】:

      猜你喜欢
      • 2017-02-15
      • 2014-05-03
      • 2019-08-26
      • 2014-11-18
      • 2018-03-15
      • 2011-04-13
      • 2014-10-04
      • 2022-11-11
      • 2016-01-04
      相关资源
      最近更新 更多