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

我正在尝试通过使用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服务时怎么会不起作用呢?

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