如何从 WCF 服务流下载文件?

Posted

技术标签:

【中文标题】如何从 WCF 服务流下载文件?【英文标题】:How to download a file from a WCF service stream? 【发布时间】:2013-02-12 03:10:26 【问题描述】:

我正在尝试通过使用 jQuery 调用 WCF 服务来远程下载 CSV 文件。由于该文件实际上并不驻留在服务器上,因此我一直在尝试将其作为流返回。由于我使用Content-Disposition 标头,客户端的浏览器应该会自动开始下载具有给定文件名的文件。

我在 C# 中的 WCF 服务方法:

[OperationContract()]
public Stream GetCsvFile(int id)

    string s = ...;
    WebOperationContext.Current.OutgoingResponse.ContentType = "text/csv";
    WebOperationContext.Current.OutgoingResponse.Headers["Content-Disposition"] = "attachment; filename=\"file1.csv\"";
    return GenerateStreamFromString(s);


public Stream GenerateStreamFromString(string s)

    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);
    writer.Write(s);
    writer.Flush();
    stream.Position = 0;
    return stream;

我的 jQuery AJAX 请求:

$.ajax(
    type: "POST",
    url: serviceUrl,
    cache: false,
    data: data,
    dataType: "text",
    contentType: "application/json; charset=utf-8",
    success: function() 
        // TODO...
    
);

此请求成功完成!我可以在响应中看到正确的 CSV 数据。但是,它不会在浏览器中启动实际的“文件下载”操作(目前在 Chrome 上测试),并且“file1.csv”不会保存到客户端的磁盘中。

在同一应用程序的旧 VB.NET 版本中,以下内容在 .aspx 页面代码隐藏中起作用:

Response.Clear()
Response.ContentType = "text/csv"
Response.AddHeader("content-disposition", "attachment; filename="file1.csv")
Response.Write(s)
Response.End()

这将自动启动“file1.csv”的文件下载。甚至不会显示“另存为”对话框,文件只会立即下载。很酷。

那为什么我尝试用 jQuery 调用 WCF 服务时它不起作用?

【问题讨论】:

您的 ajax 调用将获得文本响应。它只对 javascript 可用(它会被 jQuery“解析”,它不会/不能保存它)。请参阅this post here on SO 了解如何从 JavaScript 开始下载。 已回复***.com/questions/6668776/… 【参考方案1】:

您需要在服务器端指定正确的 ContentType

【讨论】:

以上是关于如何从 WCF 服务流下载文件?的主要内容,如果未能解决你的问题,请参考以下文章

Vue 之 new Blob() 文件流下载文件不同文件类型的 type 值整理

Java实现文件流下载文件,浏览器无反应,后台无错误!如何解决?

如何通过url方式从自己的服务器上下载文件?

怎么从Linux服务器上下载超过4G的文件?

Kotlin 协程Flow 异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 )

Kotlin 协程Flow 异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 )