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服务时,它怎么不起作用呢?
您的ajax调用将获得文本响应。它只能用于JavaScript(它将被jQuery“解析”,不会/不能保存)。看到[这篇文章在这里](http://stackoverflow.com/questions/365777/starting-file-download-with-javascript),看看如何从JavaScript开始下载。 – 2013-02-26 15:33:52
这已被回答http://stackoverflow.com/questions/6668776/download-file-through-an-ajax-call-php – 2013-02-26 15:37:26