Как выполнить код после 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();