我目前在将 Web 应用程序部署为应用服务时遇到了一个非常奇怪的问题。我不确定我做错了什么。
我的设置
由于某些依赖关系,我有一个在.net 4.8框架下运行的 ASP.net 核心2.2(网络标准库)网站。该应用程序还作为 64 位应用服务运行。
My Web.config 将 ANCM 配置为将输出可执行文件作为 OutOfProcess 运行:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath=".MyWebsite.exe" stdoutLogEnabled="true" stdoutLogFile=".logsstdout" hostingModel="OutOfProcess" />
</system.webServer>
</configuration>
将应用程序部署到本地 IIS 时,此设置工作正常。
我的问题
在启动时将同一应用程序作为应用服务部署到 Azure 时,应用程序声称它无法加载某些程序集。抛出FileNotFoundException
和 FusionLog 错误说明0x80070002 Failed to complete setup of assembly
。
经过长时间的调查,我可以将问题缩小到一个主要问题:
不允许MyWebsite.exe
从网站部署在 Azure 中的C:homesitewwwroot
文件中读取任何数据。我可以通过尝试简单地读取工作目录中的任何文件(例如位于exe旁边的exe.config)来证明这一点。
同样在FusionLog中,我可以看到一个错误,声称它无法加载exe.config。
这会导致我的应用程序无法加载它附带的任何 DLL 的问题,因为不允许文件访问。
重要的是要知道:如果我从 Kudo 控制台启动我的应用程序,它会启动正常。
更新:我在应用程序中添加了一堆额外的检查,它变得更加疯狂。可以在此要点中找到一些源见解和日志输出。
- 当我检查目录权限时,一切都很好。
- 当我列出所有文件时,我可以看到所有文件
- 当我检查文件存在和权限时,一切都很好。
- 加载文件大小等文件信息也可以。
- 但是一旦我尝试加载文件的字节,我就会得到一个
FileNotFoundException
.
更新#2:我准备了一个示例项目供大家试用。只需按照此 Git 存储库中的步骤操作:https://github.com/Danielku15/AzureFileNotFound
我的问题
如何确保我的应用程序可以访问它附带的文件?是否有特殊的部署设置或 web.config 选项,这对 Azure 中的操作很重要?
在这种情况下,问题似乎既不是 Azure,也不是我的代码。这是我用来部署应用的工具。
当我通过 JetBrains Rider 部署我的应用程序时,我遇到了上述问题,如果我通过 Visual Studio 2022 部署它,应用程序启动正常。我还不太明白这两者之间的区别,但莱德正在做一些非常错误的事情。
我开始怀疑 Rider,因为即使是具有标准设置的全新 .net 5 应用程序也无法运行。
因此,通过使用Visual Studio进行部署,为我解决了这个问题。