解决 ASP.NET Core 部署到 IIS,更新项目时"文件夹正在使用"错误

此解决方法来源于微软官方

原文地址:https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-net-6-preview-3/#shadow-copying-in-iis

项目在发布的时候,根目录会产生一个web.config文件,修改此文件为

原文如下

我们在 IIS ASP.NET 核心模块中添加了一项新功能,以添加对卷影复制应用程序程序集的支持。目前,.NET 在 Windows 上运行时会锁定应用程序二进制文件,因此当应用程序仍在运行时,无法替换二进制文件。虽然我们的建议仍然是使用应用脱机文件,但我们认识到在某些情况下(例如 FTP 部署)无法执行此操作。

在这种情况下,可以通过自定义 ASP.NET 核心模块处理程序设置来启用卷影复制。在大多数情况下,ASP.NET 核心应用程序没有签入到源代码管理中的 web.config,您可以对其进行修改(它们通常由 SDK 生成)。可以添加此示例以开始使用。web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- To customize the asp.net core module uncomment and edit the following section. 
  For more info see https://go.microsoft.com/fwlink/?linkid=838655 -->

  <system.webServer>
    <handlers>
      <remove name="aspNetCore"/>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModulev2" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout">
      <handlerSettings>
        <handlerSetting name="experimentalEnableShadowCopy" value="true" />
        <handlerSetting name="shadowCopyDirectory" value="../ShadowCopyDirectory/" />
        <!-- Only enable handler logging if you encounter issues-->
        <!--<handlerSetting name="debugFile" value=".\logs\aspnetcore-debug.log" />-->
        <!--<handlerSetting name="debugLevel" value="FILE,TRACE" />-->
      </handlerSettings>
    </aspNetCore>
  </system.webServer>
</configuration>

注意:processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" 要更改为
processPath="dotnet" arguments=".\GamePlayer.Web.dll"

GamePlayer.Web.dll 为你项目的DLL名称

../ShadowCopyDirectory/ 也可以更改为你自己存放副本的目录

否则会报错

已测试,好用

 

.net 7 中有改动

 https://weblog.west-wind.com/posts/2022/Nov/07/Avoid-WebDeploy-Locking-Errors-to-IIS-with-Shadow-Copy-for-ASPNET-Core-Apps

<aspNetCore processPath=".\Westwind.Webstore.Web.exe" 
            hostingModel="inprocess"
            stdoutLogEnabled="false" 
            stdoutLogFile=".\logs\stdout" >

 <handlerSettings>
   <handlerSetting name="enableShadowCopy" value="true" />
   <handlerSetting name="shadowCopyDirectory"       
                   value="../ShadowCopyDirectory/" />
 </handlerSettings>
 
</aspNetCore>

 

posted @ 2022-04-19 17:43  拼博之路  阅读(675)  评论(3编辑  收藏  举报