我用一块JQuery调用[WebMethod]。以下代码的目的是将最近压缩的文件发送到用户的浏览器。当用户单击“下载”按钮时,AJAX请求将发送到ASP.NET页面,并且应该发送zip文件。
这是代码。
[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();
}
当它运行时,没有任何内容发送到浏览器,但也没有抛出异常。我不确定发生了什么以及文件没有下载的原因。
'path'DEFINATELY具有正确的地址,当文件的地址是硬编码时,同样的情况发生。
非常感谢任何帮助!
谢谢,
答案 0 :(得分: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启用读取方法,我通常会在单独的服务中保留插入/更新/删除方法。