Как обрабатывать ошибки при использовании ASP.NET для создания zip-файла для загрузки?

Я работаю над функцией на своем веб-сайте 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 не работает, я хочу представить пользователю сообщение об ошибке, а не диалоговое окно загрузки. Нужно ли удалять некоторые данные из объекта Response, чтобы отменить операцию загрузки?

С наилучшими пожеланиями

ОКБ


person OKB    schedule 29.10.2010    source источник


Ответы (2)


во-первых, не звонить HttpContext.Current.ApplicationInstance.CompleteRequest();

Ссылка.

В какой-то момент был пример кода, который показывал CompleteRequest(), но это неправильно.

Во-вторых, чтобы сделать то, что вы описываете, вам нужно убедиться, что zip-файл может быть создан правильно и полностью, прежде чем что-либо отправлять. Это означает, что вы должны выполнить AddResponseDataForZipFile() только после того, как zip-файл будет полностью создан. Это означает, что вам нужно создать настоящий zip-файл на сервере, а не просто сохранить его в Response.OutputStream. Как только файл будет успешно создан, вызовите AddResponseDataForZipFile(), выполните потоковую передачу байтов для временного zip-файла, вызовите Response.Close(), затем удалите временный zip-файл.

person Cheeso    schedule 08.11.2010

Я не могу комментировать в данный момент, поэтому примите этот ответ как один.

Как работает Utils.ExportToZip? Если причина, по которой он использует Response.OutputStream для конструктора, заключается в том, чтобы записать zip-файл непосредственно в него, вам нужно установить буферизацию, чтобы «отменить» это в вашем методе AddResponseDataForZipFile:

Response.BufferOutput = true;
person Bora    schedule 29.10.2010
comment
Я провел рефакторинг своего кода и сумел исправить свою проблему. Дело в том, чтобы создать данные httpresponse после того, как вы попытались создать zip-файл. Поэтому, если что-то пойдет не так, объект ответа не будет изменен, и процесс загрузки не начнется. - person OKB; 01.11.2010