2010-08-11 138 views
1

嘗試下載zip文件時發生了非常奇怪的錯誤,並且在運行中生成。 在某些客戶端計算機上一切正常,文件downlading完美,對他人有服務器異常(我嘗試使用不同的瀏覽器進行測試):文件下載時出現ASP.NET奇怪的服務器錯誤

消息: 對象未設置爲一個對象 堆棧跟蹤的一個實例參考: вASP.development_detail_aspx .__ RenderContent1(HtmlTextWriter的__w,控制parameterContainer)вSystem.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter的作家,ICollection的兒童)вSystem.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter的作家,ICollection的兒童)в系統.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer)在System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter輸出)中System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer)在系統中m.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children)System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children)System.Web.UI.Page.Render(HtmlTextWriter writer)在System中。 Web.UI.Page.ProcessRequestMain(布爾includeStagesBeforeAsyncPoint,布爾includeStagesAfterAsyncPoint)

我的代碼在asp:ImageButton的OnClick事件。服務器是IIS 7.5:

...

using (MemoryStream output = new MemoryStream()) 
{ 
    using (ZipOutputStream s = new ZipOutputStream(output)) 
    { 
     s.SetLevel(5); // 0 - store only to 9 - means best compression 
     byte[] buffer = new byte[4096]; 


     foreach (var file in devFiles) 
     { 
      if (file.PhisicalName != "") 
      { 
       ZipEntry entry = new ZipEntry(file.RealName); 
       s.PutNextEntry(entry); 
       using (FileStream streamer = File.OpenRead(HttpContext.Current.Server.MapPath(file.PhisicalName))) 
       { 
        int sourceBytes; 
        do 
        { 
         sourceBytes = streamer.Read(buffer, 0, buffer.Length); 
         s.Write(buffer, 0, sourceBytes); 
        } 
        while (sourceBytes > 0); 
       } 
      } 
     } 

    s.Finish();  
    HttpResponse response = HttpContext.Current.Response; 
    response.Clear(); 
    response.ContentType = "application/octet-stream"; 
    response.AppendHeader("Content-Disposition", "attachment; filename=doc.zip"); 
    response.AppendHeader("Content-Length", output.Length.ToString()); 
    response.BinaryWrite(output.ToArray()); 
    response.End(); 
    output.Close(); 
    s.Close(); 
} 
+0

輸出聲明和初始化在哪裏? – Lazarus 2010-08-11 11:48:58

+0

壓縮文件的大小是多少?由於服務器上沒有足夠的內存以供w3wp進程加載附加文件 – InSane 2010-08-11 11:58:54

+0

我已經更新了代碼,因此我曾經見過類似的情況。該文件的大小約爲10M。但它適用於某些客戶..在某些不.. – vadimv 2010-08-11 12:23:24

回答

0

Finaly,找到答案。這非常簡單/愚蠢。 上面的代碼中有一個檢查用戶是否登錄。如果沒有,則不需要渲染。 對於已經登錄管理界面的用戶來說,可以,但是其他人得到了渲染異常。 謝謝大家!

0

我在這裏做一個假設,我不是100%肯定。

response.End()拋出一個異常,之後可能其餘的頁面隨機發送!因爲你(和我)不知道異常是在哪裏跳。所以關閉文件命令被繞過!

我建議刪除末(),並使用同花順()

此外,我建議使用(){}該文件打開關閉使用,也許一個如果zip文件太大,則由於內存問題而緩衝讀取文件

也與該代碼已打開的文件留下,也許在下一個週期輸出爲null,因爲無法打開文件...

+0

我試着改變結束(),並使用Flush()它不工作.. – vadimv 2010-08-11 12:25:37

+0

@Automator然後也許是拉鍊的大小,你需要改變你閱讀的方式 - 並逐個閱讀緩衝器。在女巫線你得到空例外? – Aristos 2010-08-11 12:47:02

+0

奇怪的是,某些計算機上的相同文件下載正常,而其他計算機上則相同,zip總是相同。 – vadimv 2010-08-11 13:01:56

相關問題