簡體   English   中英

為什么StreamWriter在Windows Service中不能工作?

[英]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. Constants.APP_PATH指向映射的驅動器-服務不在與登錄用戶相同的環境中運行,因此該路徑可能無效
  2. 權限-取決於服務運行的用戶身份,它可能無法訪問與WinForms應用程序相同的目錄集

沒有更多信息,任何人都無法提供幫助。 究竟以什么方式不起作用? 你有例外嗎? 它只是默默地失敗嗎?

只是一些技巧...

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_SYSTEMNETWORK_SERVICE類的服務帳戶將不會具有與用戶帳戶相同的權限。 這可以解釋為什么它作為用戶而不是服務起作用。 也可能是您的APP_PATH常數指向用戶特定的內容,例如驅動器映射到網絡共享。 驅動器映射不會覆蓋用戶,因此這也可能是一個問題。

沒有更多信息,我想您的服務所運行的帳戶無權打開該文件進行寫入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM