我有一个ASP.NET MVC网站,它与处理文件上传的Windows服务协同工作。为了便于维护站点,我希望通过网站访问Windows服务的日志文件(仅限我),以便我可以点击http://myserver/logs/myservice查看日志文件的内容。我怎么能这样做?
猜测,我可以让服务将其日志文件写入站点顶层的“Logs”文件夹中,或者我可以将其保留在原来的位置并设置虚拟目录以指向它。哪一种更好 - 还是有另一种更好的方式?
无论文件存储在何处,我都可以看到会出现另一个问题。我尝试了第一个选项(我的网站中的Logs文件夹),但是当我尝试通过HTTP访问该文件时出现错误:
该进程无法访问文件'foo',因为它正由另一个进程使用。
现在,根据经验我知道我的服务在文件运行时保持文件锁定用于写入,但是我仍然可以在记事本中打开文件来查看当前内容。 (我很惊讶IIS坚持写访问,如果发生这种情况的话)。
我怎样才能解决这个问题?我是否真的必须编写一个处理程序来读取文件并自己将其提供给浏览器?或者我可以通过配置修复此问题吗?
PS。如果有帮助,我正在使用IIS7。
答案 0 :(得分:2)
不幸的是,我担心你必须编写一个打开该文件的处理程序,并将其返回给客户端。 我编写了一个显示服务器日志文件的IIS管理器扩展,以及我注意到的即使是简单的
System.IO.File.OpenRead("")
仍然可以运行同样的问题,并返回相同的错误..这有点令人困惑。 最后我用了
System.IO.File.Open("", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
我可以在服务器向其写入日志时轻松打开文件:)
答案 1 :(得分:1)
我认为虚拟目录是一个“好的”解决方案,如果您添加目录(应用程序)的READ ONLY权限+也许“BROWSE目录”(这样您就可以看到IIS呈现的文件夹内容)。
(但是一旦你这样做,你应该考虑你也匿名访问该文件夹 - 除非你启用身份验证,所以要注意你可能会暴露的日志文件的“秘密”内容?只是一个想法。)
我更喜欢自己的另一种方法是创建一个MVC / ASP.NET页面,通过普通代码在文件夹中进行查找,这样您就可以100%过滤HTML中显示的任何数据。 您可以将文件作为TextStream打开并以只读模式打开。
如果访问日志文件夹是一个问题,我会使用具有READ ONLY访问权限的虚拟目录,然后编写一些内容,将日志文件呈现为屏幕上的HTML和我的详细程度。甚至可能首先添加某种“登录”。但这一切都取决于您的安全级别和日志文件的内容。
这对你有意义吗?如果没有,请解释更多,因为我已经经历了几次类似的情况。