2010-08-02 36 views
3

我們有一個非常簡單的ASP.Net頁面,用於將文件上傳到我們的網絡服務器。該頁面沒有控件 - 客戶端使用它每晚自動向我們發送一個文件。ASP.Net用於文件上傳的頁面停止在日誌語句中間處理

有時,文件似乎沒有得到我們,但客戶報告,他們已經發送它。

我們在頁面上添加了一些日誌語句,並發現了一些很奇怪的東西。該頁面在日誌語句中間停止執行。沒有例外,就這樣死去。

這裏是後臺代碼:

protected void Page_Load(object sender, EventArgs e) { 
    try { 
     // record that request came in at all 
     log.Debug("Update Inventory page requested through HTTP {2} on {0} {1}", DateTime.Now.ToShortDateString(), DateTime.Now.ToLongTimeString(), IsPostBack ? "POST" : "GET"); 

     // make sure directory exists 
     string basePath = Server.MapPath("~/admin/uploads/"); 
     log.Debug("Saving to folder {0}", basePath); 

     if (!Directory.Exists(basePath)) { 
      log.Debug("Creating folder {0}", basePath); 
      Directory.CreateDirectory(basePath); 
     } 

    // generate a unique file name 
     string fileName = DateTime.Now.Ticks.ToString() + ".dat"; 
     string path = basePath + fileName; 
     log.Debug("Filename to save is {0}", fileName); 

    // record initial bytes of stream/file 
    StreamReader reader = new StreamReader(stream); 
    string fileContents = reader.ReadToEnd(); 

    log.Debug("File received by GET is " + fileContents.Length + " characters long and begins with: " 
     + Environment.NewLine + fileContents.Substring(0, Math.Min(fileContents.Length, 1000))); 

    // write out file 
    File.WriteAllText(path, fileContents); 

     log.Debug("Update Inventory page processing finished."); 
     // trap for and record any and all exceptions 
    } 
    catch (Exception ex) { 
     log.Debug(ex); 
    } 
} 

處理似乎在輸出所述fileContents可變的長度和第一部分中的日誌語句的中間死。在進程失敗時發生的日誌記錄如下所示:

2010-08-02 02:46:01.7342|DEBUG|UpdateInventory|Update Inventory page requested through HTTP GET on 8/2/2010 2:46:01 AM 
2010-08-02 02:46:01.7655|DEBUG|UpdateInventory|Saving to folder c:\hosting\sites\musicgoround.com\wwwroot\admin\uploads\ 
2010-08-02 02:46:01.7811|DEBUG|UpdateInventory|Filename to save is 634163139617811250.dat 
2010-08-02 02:48:02.3905|DEBUG|UpdateInventory| 

我真的不明白該怎麼做。

我假設在文件的傳輸中有一個錯誤,即從reader.ReadToEnd()行拋出異常。如果不是例外,我希望頁面處理能夠繼續,但我可能只接收部分文件(在這種情況下,它應該記錄一些內容)。

日誌記錄語句只訪問一個字符串變量,它在一個try-catch中。 NLog是我們使用的日誌記錄組件,我們可以通過Codeplex上簡單日誌門面項目提供的外觀訪問它。因此,我們相信日誌記錄組件或多或少是防彈的 - 我們當然沒有看到我們在這裏使用它會導致問題的任何東西。

那麼,這是怎麼回事?爲什麼這個頁面能夠在這個頁面上停止並停止這樣的處理?

事實上,我們得到一個半完成的日誌記錄語句似乎指向在日誌系統中吞噬了一個錯誤 - 但這似乎不太可能 - 而且我們有NLog的內部日誌記錄,它不報告任何問題。

回答

0

最有可能的候選者是這行:

2010-08-02 02:48:02.3905|DEBUG|UpdateInventory| 

是此原因造成的:

log.Debug(ex); 

即它拋出一個異常,但記錄器沒有記錄任何有用的東西。爲什麼不嘗試稍微切換日誌級別,例如改變異常日誌記錄級別的錯誤:

log.Error(ex); 

這樣,你可以看到,如果它實際上是拋出一個異常,這是不正確記錄異常字符串的記錄。

+0

哦,我的...你的回答促使我仔細檢查NLog配置文件,我們的服務器版本與我們的開發版本不匹配 - 具體來說,佈局不在那裏,默認情況下,NLog不包含異常詳細信息在日誌佈局中。多麼疏忽...... – 2010-08-02 16:14:26

+0

他,大多數人在某個時候都有類似的問題。至少現在問題是有道理的;-) – 2010-08-02 16:35:24