2016-12-29 42 views
0

我在我的MVC C#應用程序下面的代碼:返回文件相當於Web窗體

 return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "PSL.xlsx"); 

從流返回PSL文件。我想背後做同樣的事情在我的Web窗體代碼:

  Response.Clear(); 
      Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
      Response.AddHeader("Content-Disposition", "attachment; filename=PSL.xlsx"); 
      Response.BinaryWrite(stream.ToArray()); 
      // myMemoryStream.WriteTo(Response.OutputStream); //works too 
      Response.Flush(); 
      Response.Close(); 
      Response.End(); 

想知道這是否是因爲我收到以下錯誤消息是正確的做法:

Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.} 
+0

這對我來說確實很好。你在哪裏得到這個錯誤?究竟哪條線? – HaukurHaf

+0

運行後。我有一個返回void的方法中的代碼。這兩個相同的代碼(來自MVC的代碼還是Web窗體中的代碼?) –

+0

這不是完全相同的代碼,但結果應該是相同的。設置一些標題,然後將二進制數據輸出到瀏覽器。這個錯誤信息對我來說沒有意義。我沒有得到正在評估的表達式。 – HaukurHaf

回答

0

錯誤是由撥打Response.End();時引發的ThreadAbortException引起的。看看這question

根據您撥打電話Response.End();這一事實,我認爲您包含的代碼正在ASPX頁面的事件中運行。正確?

如果是這樣,我建議您將代碼移動到加載文件的位置,並將其從ASPX頁面提供回客戶端,並將其提供給Generic handler。通用處理程序的文件擴展名爲ASHX。它非常簡單 - 它只有一個方法和一個屬性,你需要實現。主要是ProcessRequest方法。從處理器樣品稱爲ServeFile.ashx

public class ServeFile : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     byte[] fileBytes = File.ReadAllBytes("c:\\path\\to\\folder\\with\\files\\" + context.Request.QueryString["fileName"]); 
     context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
     context.Response.AddHeader("Content-Disposition", "attachment; filename=PSL.xlsx"); 
     context.Response.BinaryWrite(fileBytes); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

建立處理程序之後,你就可以改變你的aspx頁面顯示的鏈接處理程序與在QueryString合適的標識,該處理器使用加載並提供正確的文件。在示例中,文件是從文件系統中讀取的,但當然你可以從數據庫加載它或者以其他方式獲取它。