2011-08-09 61 views
0

我今天早上花了一些時間試圖幫助一個有着三個人的奇怪bug的同事難住。該方案是我們有一個正在開發的系統,它允許用戶將pdf文件附加到數據記錄中。系統使用服務來存儲和檢索服務器中的文件,並將標識符存儲在附件表中以指示哪些文件屬於哪些記錄。流媒體pdf失敗 - 找不到文件

然後,在應用程序中的兩個不同頁面上,我們有一個網格顯示記錄的附件列表。網格內有鏈接按鈕,允許用戶打開指定的附件。鏈接按鈕引發一個傳遞附件標識符作爲參數的命令事件。在命令事件處理程序中,我們從參數中獲取標識符,使用它從字節數組形式的服務中檢索附件,然後覆蓋響應對象以返回附件。這裏是代碼:

byte[] byteFile = DataHandler.GetAttachmentDocument(selectedAttachmentID); 
if (DataHandler.sErrorMsg != "") 
{//Error trying to retrieve file... 
    this.DisplayMessageBox(DataHandler.sErrorMsg); 
} 
else 
{//File retrieved... 
    Response.Clear(); 
    Response.Buffer = true; 

    Response.ContentType = "application/pdf"; 
    Response.AddHeader("content-disposition", "attachment;filename=" + lblAttachmentName.Text); 

    Response.Charset = ""; 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.BinaryWrite(byteFile); 
    Response.Flush(); 
    Response.Close(); 
    Response.End(); 
} 

現在這個完全相同的代碼在一個頁面上完美工作,並在另一個頁面上失敗。在這兩種情況下,當單擊按鈕並顯示下載對話框時,單擊打開按鈕並打開Adobe Reader閱讀器窗口。在工作頁面上,閱讀器窗口顯示所請求的文檔,但在另一頁面上,我們從閱讀器窗口中得到一個錯誤消息,說明:There was an error opening this document. This file cannot be found.在調試器中運行,我們可以逐步看到byteFile中的字節數相同,並且我們正在逐步完整無誤地完成方法。

我們已經在Google上搜索了很多,並且沒有任何運氣嘗試了幾次這段代碼的變體。我知道我們嘗試過的一些事情是將內容類型更改爲八位字節流,將內容長度添加到標題,將緩衝區更改爲false,刪除內容處置屬性。唯一明顯不同的是刪除內容處置屬性,在這種情況下顯示文檔,但顯示在原始窗口中,而不是單獨的Adobe閱讀器窗口。另一個提出但尚未嘗試的想法是將網格和關聯的邏輯提取出來,然後在兩個頁面上重複使用網絡控件。還有其他建議嗎?

回答

0

雖然我們從來沒有人能制定出什麼是造成問題,我們並確定它是至少有些用戶/計算機專用。所以我們最好的猜測是在客戶端發生某種奇怪的衝突或緩存問題。

我們最終做的工作是開發一個空白頁面,該頁面接受查詢字符串上的附件ID和名稱,執行一些安全檢查,然後返回請求的附件。這給了我們一個包含我們附件檢索代碼的單個可重用模塊。

然後我們進入提供附件的頁面,並將我們的網格模板從具有命令參數的鏈接按鈕更改爲具有綁定到新頁面路徑的導航網址的超鏈接+查詢字符串參數和目標_blank

最終的結果是,我們消除了錯誤而沒有對頁面結構進行重大更改,保持了期望的最終用戶體驗,並且代碼結構更容易維護。

感謝Leon的提示。雖然它沒有解決問題,但確實幫助我們清理了一下代碼。

1

請勿使用Response.Close()和Response.End()。 Flush()就夠了。

這裏的原因:http://blogs.msdn.com/b/aspnetue/archive/2010/05/25/response-end-response-close-and-how-customer-feedback-helps-us-improve-msdn-documentation.aspx

+0

我們嘗試了您的建議和其他一些我發現探索您的鏈接。仍然有相同的問題,其中一個頁面的代碼工作,另一個沒有。 – Rozwel

+0

您是否嘗試明確清除響應標頭? 'Response.Headers.Clear()' 另外,請檢查'lblAttachmentName.Text'是否有 - 可能是用不尋常的字符(?)以某種方式混淆了這個文件名。 – Leon