Heim  >  Artikel  >  Backend-Entwicklung  >  ASP.NET implementiert die Problembehandlung beim Herunterladen von Dateien vom Server

ASP.NET implementiert die Problembehandlung beim Herunterladen von Dateien vom Server

高洛峰
高洛峰Original
2017-02-20 17:07:281371Durchsuche

Dieser Artikel stellt hauptsächlich das Problem des Herunterladens von Dateien vom Server in ASP.NET vor. Er hat einen sehr guten Referenzwert. Schauen wir uns das mit dem Editor an.

Angenommen, es gibt einen Namen im Stammverzeichnis des Servers. In diesem Ordner werden einige vom Referenzprogramm zum Herunterladen bereitgestellte Dateien gespeichert.

 public void DownloadFile(string path, string name){
  try{
   System.IO.FileInfo file = new System.IO.FileInfo(path);
   Response.Clear();
   Response.Charset = "GB2312";
   Response.ContentEncoding = System.Text.Encoding.UTF8;
   // 添加头信息,为"文件下载/另存为"对话框指定默认文件名
   Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(name));
   // 添加头信息,指定文件大小,让浏览器能够显示下载进度
   Response.AddHeader("Content-Length", file.Length.ToString());
   // 指定返回的是一个不能被客户端读取的流,必须被下载
   Response.ContentType = "application/ms-excel";
   // 把文件流发送到客户端
   Response.WriteFile(file.FullName);
   // 停止页面的执行
   //Response.End();  
HttpContext.Current.ApplicationInstance.CompleteRequest();
  }
  catch (Exception ex){
   Response.Write("<script>alert(&#39;系统出现以下错误://n" + ex.Message + "!//n请尽快与管理员联系.&#39;)</script>");
  }
 }

Diese Funktion ist Das Gruppenprogramm der Download-Funktion, wobei Pfad der absolute Pfad der Datei (einschließlich Dateiname) und Name der Dateiname ist. Dieses Programm kann ausgeführt werden, wenn Sie HttpContext.Current.ApplicationInstance.CompleteRequest(); Bei Response.End(); wird der folgende Fehler angezeigt: Ausnahme: Der Wert des Ausdrucks kann nicht berechnet werden, da der Code optimiert wurde oder sich das native Framework im Aufrufstapel befindet. Dieser Fehler hat jedoch keine Auswirkungen auf die Ausführung von Das Programm kann diese Ausnahme zwar abfangen (nicht sicher warum)

Ich habe im Internet einige Gründe für dieses Problem gefunden: Wenn Sie die Methoden Response.End, Response.Redirect oder Server.Transfer verwenden, tritt eine ThreadAbortException auf Ausnahme wird auftreten. Sie können diese Ausnahme mit einer Try-Catch-Anweisung abfangen. Die Response.End-Methode beendet die Ausführung der Seite und schaltet die Ausführung auf das Application_EndRequest-Ereignis in der Ereignispipeline der Anwendung um. Codezeilen nach Response.End werden nicht ausgeführt. Dieses Problem tritt bei den Methoden Response.Redirect und Server.Transfer auf, da beide Methoden intern Response.End aufrufen.

Die bereitgestellten Lösungen sind:

Um dieses Problem zu beheben, verwenden Sie eine der folgenden Methoden:

Für Antwort .Ende , rufen Sie die Methode HttpContext.Current.ApplicationInstance.CompleteRequest() anstelle von Response.End auf, um die Codeausführung für das Application_EndRequest-Ereignis zu überspringen.

Verwenden Sie für Response.Redirect die Überladung Response.Redirect(String url, bool endResponse), die false für den endResponse-Parameter übergibt, um die Antwort auf Response abzubrechen . Interner Aufruf an .End. Zum Beispiel:

Response.Redirect ("nextpage.aspx", false);
 catch (System.Threading.ThreadAbortException e){
  throw;
 }
 接下来就可以通过其他函数或者事件调用这个函数来下载服务器上的文件了
 protected void btnOutput_Click(object sender, EventArgs e){
  try{
   string strPath = Server.MapPath("/") + "Download//学生基本信息模版.xls";
   DownloadFile(strPath, "学生基本信息模版.xls");
  }
  catch (Exception exp){
   Response.Write("<script>alert(&#39;系统出现以下错误://n" + exp.Message + "!//n请尽快与管理员联系.&#39;)</script>");
  }
 }

Aus diesem Ereignis ist ersichtlich, dass der erste Parameter der DownloadFile-Funktion der absolute Pfad von ist Andernfalls meldet das Programm einen Fehler.

Weitere Artikel zur ASP.NET-Implementierung des Herunterladens von Dateien vom Server finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn