1

我有这个简单的代码,记录将日志附加到文本文件:

    public static void RecordToFile(string filename, Log log)
    {
            TextWriter textWriter = new StreamWriter(Constants.APP_PATH + 
                "\\" + filename, true);
            textWriter.WriteLine(log.ToString());
            textWriter.Close();
    }

这在 Windows 窗体应用程序中完美运行。然而,使用instsrv 和 srvany技巧,我把它变成了一个 Windows 服务。该服务运行良好,访问数据库,执行查询和所有...除了这个 StreamWriter。日志只是没有得到应有的更新。任何想法为什么?

4

4 回答 4

7

该服务很可能是在没有对该目录的访问权限的用户凭据下运行的。

因此,请检查服务的属性对话框,并检查“登录”选项卡以查看它以什么身份登录。

于 2009-05-07T15:18:33.410 回答
2

可能的原因:

  1. Constants.APP_PATH 指向映射驱动器 - 服务不会在与登录用户相同的环境中运行,因此路径可能无效
  2. 权限 - 根据运行服务的用户,它可能无法访问 WinForms 应用程序所做的同一组目录
于 2009-05-07T15:19:59.990 回答
2

如果没有更多信息,任何人都无法提供帮助。它究竟以何种方式不起作用?你有例外吗?它只是默默地失败吗?

只是一些提示...

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 常量指向用户特定的东西,例如映射到网络共享的驱动器。驱动器映射不跨越用户,因此这也可能是一个问题。

于 2009-05-07T15:20:52.283 回答
0

如果没有更多信息,我猜您运行服务的帐户无权打开文件进行写入。

于 2009-05-07T15:21:14.043 回答