2013-02-26 58 views
1

我想通过使用jQuery调用WCF服务来远程下载CSV文件。由于该文件实际上并未驻留在服务器上,因此我一直试图将其作为流返回。由于我使用Content-Disposition标题,因此客户端浏览器应自动开始使用给定文件名下载文件。在C#如何从WCF服务流下载文件?

我的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服务时,它怎么不起作用呢?

+2

您的ajax调用将获得文本响应。它只能用于JavaScript(它将被jQuery“解析”,不会/不能保存)。看到[这篇文章在这里](http://stackoverflow.com/questions/365777/starting-file-download-with-javascript),看看如何从JavaScript开始下载。 – 2013-02-26 15:33:52

+0

这已被回答http://stackoverflow.com/questions/6668776/download-file-through-an-ajax-call-php – 2013-02-26 15:37:26

回答

0

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