iis发布DLL,进程无法访问该文件,因为它正在被其他进程使用

(.net6)iis发布DLL,进程无法访问该文件,因为它正在被其他进程使用

问题

虽然最近使用了.net6,但是公司服务器仍然是windows,于是还是跟往常一样部署在iis.
但是再使用过程中发现iis发布站点后,无法像以前.net framework那样可以直接替换DLL文件来发布。会提示进程无法访问该文件,因为它正在被其他进程使用。
经过上海.net群里大石头的指导,发现可以修改webconfig文件来解决这个问

解决思路

.NET 6 Preview 3的更新改动中有这样一段描述

IIS 中的浅拷贝支持
我们在 IIS 的 ASP.NET Core 模块中添加了一个新功能,以增加对浅拷贝应用程序程序集的支持。目前,.NET 在 Windows 上运行时锁定了应用程序的二进制文件,使得在应用程序仍在运行时无法替换二进制文件。虽然我们的建议仍然是使用应用程序脱机文件,但我们认识到在某些情况下(例如 FTP 部署)不可能这样做。

在这种情况下,你可以通过自定义 ASP.NET Core 模块处理程序设置来启用浅拷贝。在大多数情况下,ASP.NET Core 应用程序的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>

解决方法

先下载Hosting Bundle,iis部署所需要的扩展包,具体看下图。

image

链接地址 https://dotnet.microsoft.com/en-us/download/dotnet/6.0

修改iis生成的配置文件

添加红框内修改的地方即可。实际测试下来只有Runtime 6.0.3以上版本才有效

image

重启IIS或者重启服务器

现在已经可以覆盖DLL,也可以使用FTP的方式来发布文件了

posted @ 2022-04-21 16:50  blues小曾  阅读(939)  评论(3编辑  收藏  举报