使用ASP.NET创建zipfile供下载时如何处理错误?

使用ASP.NET创建zipfile供下载时如何处理错误?,asp.net,httpresponse,dotnetzip,Asp.net,Httpresponse,Dotnetzip,我正在开发asp.net网站中的一项功能,使用户可以下载一些文件作为zip文件。我正在使用DotNetZip库生成zip文件 我的代码如下所示: protected void OkbtnZipExport_OnClickEvent(object sender, EventArgs e) { var selectedDocumentIds = GetSelectedDocIds(); string archiveName = String.Format("arch

我正在开发asp.net网站中的一项功能,使用户可以下载一些文件作为zip文件。我正在使用DotNetZip库生成zip文件

我的代码如下所示:

protected void OkbtnZipExport_OnClickEvent(object sender, EventArgs e)
{
        var selectedDocumentIds = GetSelectedDocIds();

        string archiveName = String.Format("archive-{0}.zip", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"));            
        AddResponseDataForZipFile(Response, archiveName);            

        try
        {
            string errorMessage = Utils.ExportToZip(selectedDocumentIds, arkivdelSearchControl.GetbraArkivConnection(), Response.OutputStream);
            if (!string.IsNullOrEmpty(errorMessage))
            {
               LiteralExportStatus.Text = errorMessage;                                                     
            }
            else
                LiteralExportStatus.Text = "Success";

        }
        catch (Exception ex)
        {
            LiteralExportStatus.Text = "Failure " + ex.Message;                
        }

        Response.Flush();
        Response.Close();
        HttpContext.Current.ApplicationInstance.CompleteRequest();
}

private void AddResponseDataForZipFile(HttpResponse response, string zipName)
{
        Response.Clear();
        Response.BufferOutput = false;
        Response.ContentType = "application/x-zip-compressed";
        Response.AddHeader("content-disposition", "attachment; filename=" + zipName);
        Response.AddHeader("Expires", "0");
        Response.AddHeader("Content-Description", "Zip Arcive");
}
现在,如果出现任何问题,比如Utils.ExportToZip方法失败,我想向用户显示一条错误消息,而不是下载对话框。我是否必须从响应对象中删除一些数据才能取消下载操作

致意


好的

我现在不能评论,所以把这个答案作为一个答案

Utils.ExportToZip是如何工作的? 如果构造函数使用Response.OutputStream的原因是将zip文件直接写入其中,则需要设置缓冲,以便在AddResponseDataForZipFile方法中“撤消”:

Response.BufferOutput = true;

首先,不要调用
HttpContext.Current.ApplicationInstance.CompleteRequest()

有一次,有一些示例代码显示CompleteRequest(),但它是错误的

第二,做你描述的事,
在发送任何内容之前,您需要确保zip文件可以正确创建,并且是完整的。这意味着只有在zipfile完全创建之后,才能执行
AddResponseDataForZipFile()
。这意味着您需要在服务器上创建一个实际的zip文件,而不是简单地保存到
Response.OutputStream
。成功创建文件后,调用
AddResponseDataForZipFile()
,流式传输临时zip文件的字节,调用
Response.Close()
,然后删除临时zip文件

我重构了我的代码并设法解决了我的问题。关键是在尝试创建zip文件之后创建httpresponse数据。因此,如果出现任何错误,响应对象不会被操纵,下载过程也不会启动