[英]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.