首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 寫入日誌檔導致 Session 遺失的原因與解決

     編輯:程式設計綜合問答

現象描述

ASP.NET 應用程式中,呼叫 StreamWriter.WriteLine 寫入網站目錄下的日誌檔後,Session 立即遺失;註解該行則正常。

根本原因

**ASP.NET 檔案監視機制**:網站根目錄(含子目錄)下的檔案變更(建立、修改、刪除),會觸發 **應用程式域重啟**,導致 In-Process Session 清空。

  • HttpRuntime 內建 FileChangesMonitor 監視 *.config、*.aspx、App_Code、Bin 等目錄。
  • 寫入 LogPath 若在網站虛擬目錄下,即會觸發重啟。

解決方案

方案一:將日誌目錄移出網站根目錄(推薦)

// 設定在 web.config 或程式碼中
string logPath = @"D:\Logs\MyApp\"; // 非網站目錄

方案二:配置 fcnMode 忽略特定目錄

在 web.config 中設定:

<httpRuntime fcnMode="Disabled" /> 
// 或
<httpRuntime fcnMode="NotSet" /> // 僅停用子目錄監視

但會失去自動偵測程式碼變更重啟的便利性,**不建議生產環境使用**。

方案三:使用外部日誌框架(log4net, Serilog, NLog)

  • 內建支援滾動檔案、非同步寫入、多目標輸出。
  • 預設寫入 App_Data 外部路徑,不觸發重啟。
  • 範例:
<log4net>
  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="D:\Logs\MyApp\log.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="10MB" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
</log4net>

最佳實務

  1. **日誌路徑務必置於網站虛擬目錄之外**。
  2. 採用成熟日誌框架,避免手動 StreamWriter 管理檔案鎖定、效能、格式化問題。
  3. 若必須在網站目錄下,僅限 App_Data 且設定 fcnMode,但仍有風險。

遵循「日誌不進網站目錄」原則,即可徹底解決 Session 遺失問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved