【问题标题】:The wcf service loses the logswcf 服务丢失日志
【发布时间】:2018-09-04 19:03:31
【问题描述】:

我对 WCF 会话和日志文件有疑问。 WCF 托管在 Windows 服务中,并为来自 ASP.NET Web 应用程序的请求提供服务。每个用户连接都有自己的“在内存中”的会话,并且有一个会话 ID。每个会话初始化一个新的日志类,并为每个用户在不同的文件夹中写入日志。碰巧在一段时间后文件保持增长和日期时间更新,但文件中不存在行。 我怀疑文件系统或框架的缓冲不会写入所有行,所以我改为使用 NO_BUFFERING 选项的 CreateFile Win32 API。

SafeFileHandle hcFile = Win32API.CreateFile(@"C:\Temp\File.log", System.IO.FileAccess.Write,
                System.IO.FileShare.Read, IntPtr.Zero,
                System.IO.FileMode.Append,
                (System.IO.FileAttributes)Win32API.FILE_FLAG_NO_BUFFERING, IntPtr.Zero);

        if (!hcFile.IsInvalid) {
            FileStream fs = new FileStream(hcFile, FileAccess.ReadWrite);
            StreamWriter sw = new StreamWriter(fs);
            sw.WriteLine("Log row log row log row");
            sw.WriteLine("Log row log row log row");
            sw.WriteLine("Log row log row log row");
        } 

但是句柄总是无效的? 你有什么想法吗?

谢谢

【问题讨论】:

  • 如果调用失败,请使用GetLastError 获取有关特定错误的详细信息。 (请参阅 CreateFile 的 MSDN 文档。)但即便如此,如果您使用 FILE_FLAG_NO_BUFFERING 打开文件,您必须写入整个扇区,该扇区可能高达 4096 字节。综上所述,我怀疑缓冲是否存在问题,因为成千上万的人正在做同样的事情而没有问题。您是否验证过您的日志记录进程实际上正在尝试写入日志?完成文件后,您是否正确关闭了文件?您的程序中是否有其他东西泄漏句柄?

标签: c# asp.net wcf winapi


【解决方案1】:

你为什么用win32?您可以轻松地使用 File 对象。

var logFile = System.IO.File.Open(filePath, System.IO.FileMode.Append);

或者因为你把所有的文本行放在一个数组中,然后一次写入。

System.IO.File.WriteAllLines(filePath,new string[] { "Line 1", "Line 2" , "Line 3"});

注意...如果您是通过 WCF Web 服务编写此内容,请记住运行 Web 服务的帐户需要对该目录的写入权限。

【讨论】:

  • 感谢您的建议。我会试试的。对于停止写日志的WCF?有什么想法吗?
  • 我不知道你在问什么
  • 我为我的不精确向 Kevbo 道歉。看起来,经过一段时间的正确工作,WCF 文件中的库不会将文本行写入日志文件。磁盘大小增加,但日志不存在。
  • 我会检查保存它的路径并检查文件夹的权限。 Windows 更新中的更新可能会影响这些事情。我已经为应用程序编写了许多日志文件,而权限通常是问题所在。
  • 向前迈出一步...我们发现streamwriter突然为空!也许如果wcf空闲卸载dll?有一种方法可以检测何时以及谁将 streamwriter 设置为 null?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多