【发布时间】: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 字节。综上所述,我怀疑缓冲是否存在问题,因为成千上万的人正在做同样的事情而没有问题。您是否验证过您的日志记录进程实际上正在尝试写入日志?完成文件后,您是否正确关闭了文件?您的程序中是否有其他东西泄漏句柄?