Azure 应用服务无法访问文件,因此甚至无法加载程序集

Posted

技术标签:

【中文标题】Azure 应用服务无法访问文件,因此甚至无法加载程序集【英文标题】:Azure App Service cannot access files and therefore not even load Assemblies 【发布时间】:2021-12-29 04:09:40 【问题描述】:

在将我的 Web 应用程序部署为应用服务时,我目前正面临一个非常奇怪的问题。而且我不确定自己做错了什么。

我的设置

由于某些依赖关系,我有一个在 .net 4.8 框架下运行的 ASP.net core 2.2(netstandard 库)网站。该应用程序还作为 64 位应用程序服务运行。

我的 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=".\logs\stdout" hostingModel="OutOfProcess" />
    </system.webServer>
</configuration>

在将应用程序部署到本地 IIS 时,此设置运行良好。

我的问题

在启动时将相同的应用程序作为应用服务部署到 Azure 时,应用程序声称它无法加载某些程序集。有 FileNotFoundExceptions 抛出和 FusionLog 错误声明 0x80070002 Failed to complete setup of assembly

经过长时间的调查,我可以将问题缩小到一个主要问题:

MyWebsite.exe 不允许从 C:\home\site\wwwroot 中的文件中读取任何数据,其中网站部署在 Azure 中。我可以通过尝试简单地读取工作目录中的任何文件(例如 exe 旁边的 exe.config)来证明这一点。

在 FusionLog 中我还可以看到一个错误,声称它无法加载 exe.config。

这导致我的应用程序无法加载它附带的任何 DLL,因为不允许文件访问。

重要的是要知道:如果我从 Kudo 控制台启动我的应用程序,它可以正常启动。

更新:我在我的应用程序中添加了一堆额外的检查,它变得更加疯狂。可以在 this gist 中找到一些 Source 见解和日志输出。

当我检查目录权限时,一切正常。 当我列出所有文件时,我可以看到所有文件 当我检查文件存在和权限时,一切都很好。 也可以加载文件大小等文件信息。 但当我尝试加载文件的字节时,我得到一个FileNotFoundException

更新#2:我准备了一个示例项目供大家试用。只需按照此 Git Repo 中的步骤操作:https://github.com/Danielku15/AzureFileNotFound

我的问题

如何确保我的应用程序可以访问它附带的文件?是否有对 Azure 中的操作很重要的特殊部署设置或 web.config 选项?

【问题讨论】:

更改此APP SETTING KEY, WEBSITE_RUN_FROM_PACKAGE = 1 此设置使wwwroot成为只读文件系统。 @HarshithaVeeramalla-MT 我认为这不是我想要的。我不想从 ZIP 运行我的应用程序或确保 wwwroot 是只读的。我的问题是我的应用程序无法加载随可执行文件一起提供的任何程序集。 尝试使用 hostingModel="inProcess" .net Framework does not supportinProcess 托管模型。 【参考方案1】:

在这种情况下,问题似乎既不是 Azure,也不是我的代码。这是我用来部署我的应用程序的工具。

当我通过 JetBrains Rider 部署我的应用程序时,我遇到了上述问题,如果我通过 Visual Studio 2022 部署它,应用程序可以正常启动。我还不太明白这两者之间的区别,但 Rider 做的事情非常错误。

我开始怀疑 Rider,因为即使是具有标准设置的全新 .net 5 应用程序也无法运行。

因此,我通过使用 Visual Studio 进行部署解决了这个问题。

【讨论】:

以上是关于Azure 应用服务无法访问文件,因此甚至无法加载程序集的主要内容,如果未能解决你的问题,请参考以下文章

Azure blob 到 Azure SQL 数据库:无法批量加载,因为无法打开文件“xxxx.csv”。操作系统错误代码 5(访问被拒绝。)

无法加载文件或程序集“msshrtmi”或其依赖项之一(Azure 表存储访问)

Azure 数据工厂。无法通过 HTTP 连接器加载文件

Azure 函数无法加载文件或程序集“System.Security.Cryptography.Pkcs”

Azure 函数无法访问 Azure Blob

Azure 功能:无法加载文件或程序集 Microsoft.IdentityModel.Tokens,版本 = 5.2.1.0