【问题标题】:how to make code execute after Response.end如何在 Response.end 之后执行代码
【发布时间】:2023-03-25 11:35:01
【问题描述】:

我的代码是这样的

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");
     }

这里我想在浏览器中下载name.pdf,下载后我想删除那个文件。但是代码执行停止在

HttpContext.Current.Response.End();

该行执行后没有代码。所以我的删除功能不起作用。有没有解决这个问题的方法?

【问题讨论】:

  • 把这段代码 HttpContext.Current.Response.End();在 Delte() 之后。 Response.End() 将停止asp.net中的Page Life cycel Execution
  • @AKS 什么后台工作者?
  • @nmat :这是对另一条评论的回复。我想他已经删除了它
  • @AkshayJoy 已经尝试过了。但是在那之后下载不会发生。因为文件不存在

标签: c# asp.net


【解决方案1】:
// 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()

【讨论】:

    【解决方案2】:

    HttpResponse.End(根据documentation)引发ThreadAbortException,并且由于您没有尝试处理此问题,因此您的方法将退出。

    我不确定为什么必须使用 End(),但可以将“清理”代码放在 finally 语句中。

    【讨论】:

    • 将 End() 更改为 HttpContext.Current.Response.Flush();帮助
    【解决方案3】:

    可能会触发一些异步方法(触发并忘记样式)来删除文件,或者在服务器上使用清理服务在特定时间和规则后删除所有文件。

    就像提到的那样 Reponse.End 非常苛刻和最终......更多细节在这里: Is Response.End() considered harmful?

    只是我的想法... =)

    【讨论】:

      【解决方案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();
      

      【讨论】:

        猜你喜欢
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多