[英]Why doesn't StreamWriter work in a Windows Service?
我有一個簡單的記錄代碼,可將日志追加到文本文件:
public static void RecordToFile(string filename, Log log)
{
TextWriter textWriter = new StreamWriter(Constants.APP_PATH +
"\\" + filename, true);
textWriter.WriteLine(log.ToString());
textWriter.Close();
}
這在Windows Forms應用程序中完美運行。 但是,使用instsrv和srvany技巧,我將此設置為Windows Service。 該服務運行良好,訪問數據庫,執行查詢以及所有操作……除了此StreamWriter。 日志只是沒有得到應有的更新。 有什么想法嗎?
該服務很可能在沒有該目錄訪問權限的用戶憑據下運行。
因此,請檢查該服務的屬性對話框,然后檢查“登錄”選項卡以查看其登錄時的狀態。
可能的原因:
沒有更多信息,任何人都無法提供幫助。 究竟以什么方式不起作用? 你有例外嗎? 它只是默默地失敗嗎?
只是一些技巧...
1)不要使用字符串串聯來創建文件路徑。 請改用System.IO.Path.Combine
。 像這樣:
TextWriter textWriter = new StreamWriter(
System.IO.Path.Combine(Constants.APP_PATH, filename), true);
2)將您的編寫器包含在using()
塊中。 像這樣:
using(TextWriter textWriter = new StreamWriter(
System.IO.Path.Combine(Constants.APP_PATH, filename), true))
{
textWriter.WriteLine(log.ToString());
}
3)驗證服務所使用的帳戶是否有權訪問該目錄中的創建/覆蓋文件。 通常,諸如LOCAL_SYSTEM
或NETWORK_SERVICE
類的服務帳戶將不會具有與用戶帳戶相同的權限。 這可以解釋為什么它作為用戶而不是服務起作用。 也可能是您的APP_PATH常數指向用戶特定的內容,例如驅動器映射到網絡共享。 驅動器映射不會覆蓋用戶,因此這也可能是一個問題。
沒有更多信息,我想您的服務所運行的帳戶無權打開該文件進行寫入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.