我尝试使用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()
这将自动启动“file 1. csv”的文件下载。甚至不会显示“另保存为”对话框,文件只会立即下载。这相当酷。
那么,当我尝试使用jQuery调用WCF服务时,它为什么不起作用呢?
1条答案
按热度按时间jv4diomz1#
您需要在服务器端指定正确的ContentType