c# - ASP.NET Web API StreamContent - 让浏览器显示下载进度

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

我在 ASP.NET Web Api 2.x Controller 中使用 StreamContent 的实例提供文件服务类型。请求文件时,其 blob 位于数据库中,并打开 blob 流。然后将 blob 流用作 StreamContent 实例的输入。

归结起来,我的 Controller 操作看起来类似于:

[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(或任何其他浏览器)显示下载进度?

我认为这可以通过包含标题信息(如内容类型、内容长度和内容处置)来解决,但根据我的尝试,这没有任何区别。

最佳答案

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

关于c# - ASP.NET Web API StreamContent - 让浏览器显示下载进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24770778/

相关文章:

javascript - C# - 从代码隐藏中添加 javascript 函数

c# - 从字符串公式映射变量

javascript - 让 google-chrome 浏览器在页面加载时全屏显示

google-chrome - 如何清除Chromium浏览器的图标缓存

url - 如何在 url 中使用 at 符号 (@)?

c# - Linq-to-entities,一次查询得到结果+行数

c# - 像素坐标到 3D 线(opencv)

c# - SavingChanges 事件与 SaveChanges 覆盖之间的区别?

c# - 通用类型作为通用类型

.net - 母版页与用户控件与自定义控件之间的区别