2013-02-26 41 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