Web部署失败,因为文件正在使用中。

9
我正在使用微软的Web Deploy Remote Agent服务,可以让我轻松地从Visual Studio向服务器发布代码。
我要发布的网站正在使用log4net将消息记录到日志文件中,每当我尝试发布新版本的代码时,就会在Visual Studio中出现此错误,指出当前的log4net日志文件正在使用中:
"处理远程计算机上的请求时发生错误。文件 'Web.log' 正在使用中。由于另一个进程正在使用,因此无法访问“C:\inetpub\wwwroot\Logs\Web.log”。
我可以通过在服务器上执行iisreset来解决这个问题,然后再进行发布...但这有点违背了从Visual Studio进行“简单”发布的初衷 :)
是否有某种方法可以使发布任务自动发出iisreset命令,或者其他方法可以解决这个问题?

这是你的log4Net日志文件吗? - Tommy
@Tommy 是的,抱歉,我应该让那更清晰 :) - Cocowalla
我在想,你是否可以在global.asax中连接到Application_End事件,并调用log4Net的关闭选项。这应该会释放文件上的锁定。我没有必要这样做,因此没有发布答案,但是有一些与出于各种其他原因关闭日志记录服务相关的SO问题和其他项目。 - Tommy
@Tommy 尝试过了,但是没有起作用。当发布时,Application_End 事件似乎没有被调用 :( - Cocowalla
2个回答

9

我不断地探索,发现在其他一些论坛上有关于文件被锁定的一些小提示。你尝试过添加吗?

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

Apache文档,将<appender>元素添加到web.config文件中:

每次AcquireLock/ReleaseLock周期仅打开一次文件,因此保持锁定时间最短。这种锁定方法比FileAppender.ExclusiveLock慢得多,但允许其他进程在记录日志的同时移动/删除日志文件。

至于性能考虑,我认为你需要测试一下是否会受到影响,因为我假设它确实取决于你写入日志文件的频率以及这对性能的影响程度。但我不相信获取/释放锁可能需要那么长时间。


6

有一个名为recycleAppMSDEPLOY提供程序,正是用于此目的。您可以将其包含在部署清单中。

另一个选项是使用ignoreOnErrors标志,它将跳过正在使用的文件并继续进行部署。


你能提供一些关于recycleApp的信息以及如何实际包含它的方法吗?我在Visual Studio中没有看到任何选项,同样适用于ignoreOnErrors标志。 - Cocowalla
您可以手动运行此命令作为预部署步骤,也可以使用VS部署步骤自动化 - 请查看AfterTargets="CopyAllFilesToSingleFolderForPackage"。目前在VS中还没有选项可以告诉它回收应用程序 - 只有文件+ SQL发布选项。 - SliverNinja - MSFT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接