1

我有一个 ASP.NET Web API 操作,它创建一个文件并返回一个流内容:

public HttpResponseMessage Get(string filePath)
{
    // create file
    var file = FileConverter.GenerateExcelFile(filePath);

    var stream = new FileStream(filePath, FileMode.Open);

    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
    result.Content = new StreamContent(stream);
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
    result.Content.Headers.ContentDisposition.FileName = Path.GetFileName(filePath);
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    return result;
}

我想使用 HttpClient 下载返回的文件。这是我现在拥有的:

    client.GetAsync(address).ContinueWith(
        (requestTask) =>
        {
             HttpResponseMessage response = requestTask.Result;

            // response.EnsureSuccessStatusCode();

            response.Content.ReadAsStreamAsync().ContinueWith(
                        (readTask) =>
                        { 
                            var stream = readTask.Result; 
                        });
        });

得到结果后如何强制实际下载?

编辑:我正在使用 ASP.NET 4.0 WebForms。

4

3 回答 3

3

你有没有想过只是打电话:

client.GetByteArrayAsync(address)

而是获取字节数组结果,然后将其保存到内存流中?

编辑::

尝试这样的事情:

var contentBytes = await client.GetByteArrayAsync(address);
Stream stream = new MemoryStream(contentBytes);
于 2013-04-25T17:07:40.963 回答
1

为什么你认为下载没有发生?

默认情况下,当您使用GetAsyncHTTP 客户端创建 MemoryStream 作为结果缓冲区时。ReadAsStreamAsync 只是返回缓冲的 StreamContent。

编辑:你可以像这样创建一个文件,

  using (FileStream fs = new FileStream("file.txt", FileMode.Create)) {
           stream.CopyTo(fs);
        }
    }
于 2013-04-26T14:32:28.303 回答
-1

HttpClient 在服务器端而不是在 Web 浏览器中运行,因此您在此处尝试实现的目标确实令人困惑。如果您确实需要使用 HttpClient ,您可以将结果流保存到文件流中,您可以在评论中阅读。

如果您希望在 Web 浏览器中下载文件,您不需要也不能使用 HttpClient。正如您在评论中所写的那样,它已经有效,只需创建一个用户可以点击的链接。或者搜索ajax下载文件。

于 2014-03-22T17:17:01.287 回答