2013-01-02 66 views
0

我正在使用WCF上傳和下載文件。我正在使用下面的下載。文件已下載,但內容丟失

try 
     { 
      MyService.IWITSService clientDownload = new WITSServiceClient(); 
      MyService.DownloadRequest requestData = new DownloadRequest(); 
      MyService.RemoteFileInfo fileInfo = new RemoteFileInfo(); 
      requestData.ItemID = Convert.ToInt32(Request.QueryString["id"]); 

      fileInfo = clientDownload.DownloadFile(requestData); 

      Response.BufferOutput = false; // to prevent buffering 
      byte[] buffer = new byte[6500000]; 
      int bytesRead = 0; 

      HttpContext.Current.Response.Clear(); 
      HttpContext.Current.Response.ClearHeaders(); 
      HttpContext.Current.Response.ContentType = fileInfo.FileExt; 
      HttpContext.Current.Response.AddHeader("Content-Disposition","attachment; filename=" + fileInfo.FileName); 

      bytesRead = fileInfo.FileByteStream.Read(buffer, 0, buffer.Length); 

      while (bytesRead > 0) 
      { 
       // Verify that the client is connected. 
       if (Response.IsClientConnected) 
       { 

        Response.OutputStream.Write(buffer, 0, bytesRead); 
        // Flush the data to the HTML output. 
        Response.Flush(); 

        buffer = new byte[6500000]; 
        bytesRead = fileInfo.FileByteStream.Read(buffer, 0, buffer.Length); 

       } 
       else 
       { 
        bytesRead = -1; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      // Trap the error, if any. 
      System.Web.HttpContext.Current.Response.Write("Error : " + ex.Message); 
     } 
     finally 
     { 
      Response.Flush(); 
      Response.Close(); 
      Response.End(); 
      System.Web.HttpContext.Current.Response.Close(); 
     } 

文件已下載但文件數據未顯示。文件大小與實際的 大小相同。可以任何一個幫我在哪裏我必須改變.. 在此先感謝..

+0

你有沒有通過這個代碼在調試器走到驗證數據從服務器讀取? – ChrisF

+0

是..數據是從服務器讀取的.. – MindFresher

+0

什麼類型的文件,您正在上傳? – MahaSwetha

回答

0

你不想既不要求電話Response.Close()也不System.Web.HttpContext.Current.Response.Close()。它中斷與客戶端的連接。

HttpResponse.Close Method文檔說:

該方法終止於急劇 的方式與客戶端的連接,並且不旨在用於正常的HTTP請求的處理。 方法向客戶端發送重置數據包,這可能會導致在服務器,客戶端或其中某處 之間的數據被緩存的響應被丟棄。

您可能會使用此方法來響應惡意HTTP 客戶端的攻擊。但是,通常您應該調用CompleteRequest,而不是 您要跳轉到EndRequest事件併發送對 客戶端的響應。

因此減少finally代碼:

finally 
{ 
    Response.Flush(); 
    Response.End(); 
}