Как выполнить код после Response.end

Мой код похож на этот

HttpContext.Current.Response.Clear();
     HttpContext.Current.Response.ContentType = "application/pdf";
     HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" + "name" + ".pdf");
     HttpContext.Current.Response.TransmitFile("~/media/pdf/name.pdf");
     HttpContext.Current.Response.End();
     if (FileExists("/media/pdf/name.pdf"))
     {
         System.IO.File.Delete("D:/Projects/09-05-2013/httpdocs/media/pdf/name.pdf");
     }

Здесь я хочу загрузить имя .pdf в браузере, а после загрузки я хочу o удалить этот файл. Но выполнение кода останавливается на

HttpContext.Current.Response.End();

нет кода после выполнения этой строки. Так что моя функция удаления не работает. Есть ли какая-нибудь работа для этой проблемы?

Ответ 1

HttpResponse.End (согласно документации) повышает значение ThreadAbortException и, поскольку вы не пытаетесь обработать этот метод, выходите.

Я не уверен, почему именно вы должны использовать End(), но вы можете поместить код "cleanup" в оператор finally.

Ответ 2

// Add headers for a csv file or whatever
Response.ContentType = "text/csv"
Response.AddHeader("Content-Disposition", "attachment;filename=report.csv")
Response.AddHeader("Pragma", "no-cache")
Response.AddHeader("Cache-Control", "no-cache")

// Write the data as binary from a unicode string
Dim buffer As Byte()
buffer = System.Text.Encoding.Unicode.GetBytes(csv)
Response.BinaryWrite(buffer)

// Sends the response buffer
Response.Flush()

// Prevents any other content from being sent to the browser
Response.SuppressContent = True

// Directs the thread to finish, bypassing additional processing
HttpContext.Current.ApplicationInstance.CompleteRequest()

Ответ 3

Возможно, пожарит некоторый метод асинхронизации (стиль огня и забыть), чтобы удалить файл или очистить службу на сервере, чтобы удалить все ваши файлы после определенного времени и правила.

Как упоминалось о Reponse.End довольно суровый и окончательный... подробнее здесь: Является ли Response.End() считающимся вредным?

просто мои мысли об этом... =)

Ответ 4

У меня была такая же проблема. попробуйте это: скопируйте в MemoryStream → удалить файл → скачать.

string absolutePath = "~/your path";
try {
    //copy to MemoryStream
    MemoryStream ms = new MemoryStream();
    using (FileStream fs = File.OpenRead(Server.MapPath(absolutePath))) 
    { 
        fs.CopyTo(ms); 
    }

    //Delete file
    if(File.Exists(Server.MapPath(absolutePath)))
       File.Delete(Server.MapPath(absolutePath))

    //Download file
    Response.Clear()
    Response.ContentType = "image/jpg";
    Response.AddHeader("Content-Disposition", "attachment;filename=\"" + absolutePath + "\"");
    Response.BinaryWrite(ms.ToArray())
}
catch {}

Response.End();