如何从WCF服务流下载文件

本文关键字:下载 文件 服务 WCF | 更新日期: 2023-09-27 18:01: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服务时它不工作呢?

如何从WCF服务流下载文件

您需要在服务器端指定合适的ContentType