【发布时间】:2020-12-15 00:27:24
【问题描述】:
在 Asp.Net 中,卷影复制允许在不卸载应用程序域的情况下更新应用程序域中使用的程序集。 由于 Mvc Core 不支持 AppDomain 并且无法加载重复的不同版本的程序集。 我正在寻找一种在运行时更新程序集而无需卸载或停止站点的方法。 如果远程服务器上可用,我的目标是使用新版本更新站点。
【问题讨论】:
标签: c# asp.net-core-mvc
在 Asp.Net 中,卷影复制允许在不卸载应用程序域的情况下更新应用程序域中使用的程序集。 由于 Mvc Core 不支持 AppDomain 并且无法加载重复的不同版本的程序集。 我正在寻找一种在运行时更新程序集而无需卸载或停止站点的方法。 如果远程服务器上可用,我的目标是使用新版本更新站点。
【问题讨论】:
标签: c# asp.net-core-mvc
您可以在此处找到解决方法:The site DLL seems to be intermittently locked when publishing。诀窍包括创建一个子目录(例如 /PREVIOUS),移动该目录中的“旧”文件,更改 web.config 以指向该目录中的 exe,发布新站点并再次更改 web.config。当然,这应该是脚本化的……如果您设置了“在目标位置删除其他文件”,您将无法使用子目录,但您当然可以将该目录放在其他位置(只要 IIS 可以访问它)。
【讨论】:
我也想要这个。我知道的当前最佳解决方法 - 当您想要覆盖正在使用的程序集时,将一个文件放在名为:
app_offline.htm
...这将使站点暂时脱机,允许您覆盖文件。完成后删除或重命名文件。
如果您编写此脚本,则影响很小。
【讨论】:
我找到了解决方案,它为我解决了 VS2017 中由于 IIS Express 生成的 dotnet.exe 进程锁定程序集而导致的构建错误问题。我刚刚将预构建脚本添加到 ASP.NET Core Web 应用程序,触摸 applicationhost.config 文件,该文件位于隐藏的 .vs 目录中,IIS Express 将其用作配置文件。它在 .csproj 文件中看起来像这样:
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command="IF EXIST "$(SolutionDir)\.vs\config\applicationhost.config" (pushd $(SolutionDir)\.vs\config\ & copy /b applicationhost.config +,, & popd)" />
</Target>
一旦脚本接触到文件,IIS express 就会终止 dotnet.exe 进程,允许构建成功进行。新的 dotnet.exe 进程在对 Web 应用程序的下一个请求时生成。
更新
对于 VS 2019,applicationhost.config 文件的位置已更改,因此 .csproj 文件中的预构建脚本事件看起来会略有不同:
<Target Name="PreBuild" BeforeTargets="PreBuildEvent" Condition="$(Configuration) == 'Debug'">
<Exec Command="IF EXIST "$(SolutionDir)\.vs\<SolutionName>\config\applicationhost.config" (pushd "$(SolutionDir).vs\<SolutionName>\config\" & copy /b applicationhost.config +,, & popd)" />
</Target>
其中<SolutionName> 是解决方案文件名,不带扩展名.sln。
还需要从IIS Express配置文件$(SolutionDir)\.vs\<SolutionName>\config\applicationhost.config中删除属性hostingModel="InProcess",该属性是VS在IIS Express下启动Web应用程序时自动生成的。
【讨论】: