ASP.NET Response.TransmitFile()似乎不起作用

时间:2010-09-07 13:19:14

标签: asp.net response

我用一块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具有正确的地址,当文件的地址是硬编码时,同样的情况发生。

非常感谢任何帮助!

谢谢,

1 个答案:

答案 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启用读取方法,我通常会在单独的服务中保留插入/更新/删除方法。