繁体   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