2010-09-07 130 views
1

我正在用一塊JQuery調用[WebMethod]。以下代碼旨在將最近的壓縮文件發送到用戶的瀏覽器。當用戶點擊「下載」按鈕時,AJAX請求被髮送到ASP.NET頁面,並且應該發送zip文件。ASP.NET Response.TransmitFile()似乎不工作

這是代碼。

[WebMethod] 
    public static void DownloadAlbum(string folderToDownload) 
    { 
     string archiveDir = ""; 

     ...some code... 

     HttpContext.Current.Response.ContentType = "application/zip"; 
     HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" + path); 
     HttpContext.Current.Response.TransmitFile(path); 
     HttpContext.Current.Response.End(); 
    } 

當此運行時,沒有任何內容被髮送到瀏覽器,但也不會引發任何異常。我不確定發生了什麼以及爲什麼文件沒有下載。

'路徑'DEFINATELY具有正確的地址,並且當文件的地址是硬編碼時會發生同樣的情況。

任何幫助將不勝感激!

感謝,

回答

1

當我通過網絡服務傳輸文件,我通常做的事情有點不同。我不會假裝這是做到這一點的唯一方法,但它在過去對我有用。

我寧願檢索使用HTTP GET動詞的文件,內容如下:

[WebMethod()] 
[ScriptMethod(UseHttpGet = true)] 
public void DownloadAlbum(string folderToDownload) 
{ 
    var path = // calculate and validate path... 

    HttpContext.Current.Response.ContentType = "application/zip"; 
    HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" + path); 
    HttpContext.Current.Response.TransmitFile(path); 
    HttpContext.Current.Response.End(); 
} 

注意,此方法屬於一個的.asmx服務,而不是一成不變的。

在web.config,我啓用HTTPGET服務(Documents.asmx)如下:

<location path="Documents.asmx"> 
    <system.web> 
    <webServices> 
     <protocols> 
     <add name="HttpGet"/> 
     </protocols> 
    </webServices> 
    </system.web> 
</location> 

隨着構成像這樣的服務,該服務可通過常規的超鏈接被稱爲無AJAX,從應用程序相關的URL ~/Documents.asmx/DownloadAlbum?folderToDownload=myfoldername

請注意,爲了降低CSRF攻擊的風險,您應該避免在可更新系統的服務上啓用HttpGet。如果我打算使用GET方法讀取方法,我通常會在單獨的服務中保留插入/更新/刪除方法。

+0

這看起來很有前途。 – icecreamsoop 2010-09-08 14:34:34

+0

我還在這裏學習; .asmx文件的內容是什麼? – icecreamsoop 2010-09-08 14:34:55

+0

@ice - 這實際上可能會有所不同。大多數服務將使用代碼隱藏(.asmx.cs)來存儲實際代碼,而.asmx文件僅包含一個標識包含代碼的類的<%@ WebService%>指令。在** Add - > New Item ... **菜單中的項目中創建一個新的服務,並檢查生成的.asmx和.asmx.cs文件作爲示例。對於我的許多服務,我爲該類添加了一個'[ScriptService]'屬性,並定製了[[WebService]]命名空間。這有幫助嗎? – kbrimington 2010-09-08 14:53:52