【问题标题】:File system issue in Azure app service - Unable to create DirectoriesAzure 应用服务中的文件系统问题 - 无法创建目录
【发布时间】:2021-04-28 17:11:52
【问题描述】:

我们在生产环境中的 Azure 应用服务(Windows 机器)中托管了一个 dotnet 核心应用程序。它由两个组件组成 -

  • 电子邮件服务
  • 业务规则引擎

电子邮件服务首先将所有电子邮件下载到托管应用程序的同一目录中的文件夹Attachments (D:\home\wwwroot\)。对于每封电子邮件,都会在 Attachments 目录下创建一个单独的目录(带有 guid 值)。

业务规则引擎访问该文件夹并使用电子邮件及其附件。完成后,我们从Attachments 目录中清除所有内容。

我们看到的问题是,在处理了一定数量的电子邮件后,我们的应用程序突然无法在Attachments 文件夹下创建目录。声明

Directory.CreateDirectory({path}) 

抛出一个错误,指出找不到指定的路径。

我们能够解决此问题的唯一方法是重新启动应用服务,它会再次愉快地继续创建目录、处理电子邮件,直到它在一天左右再次失败 8-|

我们已经尝试过 -

  • 我们的应用程序是多线程应用程序,因此假设可能有一个线程由于资源处理不正确或不完整而锁定文件系统,我们将其更改为单线程处理

  • 在创建目录的地方,我们使用DirectoryInfo,所以在每次删除、创建目录等操作后尝试使用DirectoryInfo.Refresh()

  • 无论在哪里使用 FileStream,我们都添加了明确的 .Dispose() 语句来处理 FileStream

  • 在每次服务运行结束时调用GC.Collect()

我怀疑此问题是由 Azure 环境引起的,但我们无法确定导致此问题的原因。有没有人遇到过这样的问题,如果有,是怎么解决的?

【问题讨论】:

    标签: c# azure asp.net-core azure-web-app-service


    【解决方案1】:

    我根据我在此处的这些链接中阅读的内容对我的代码进行了一些更改,这些链接很好地总结了 Azure 应用服务中的存储系统 -

    D:\local 目录指向一个文件夹,该文件夹只能由该服务实例访问,而不是我之前使用的在实例之间共享的文件夹 - D:\home

    所以我更改了代码以解析%Temp% 环境变量,该变量解析为D:\local\Temp,然后使用该位置来存储下载的电子邮件。

    到目前为止,已经执行了多次测试运行,没有任何与文件系统相关的异常。

    【讨论】:

      【解决方案2】:

      是的,根据您的问题描述,它看起来确实是一个沙盒限制。为了在这方面提供更多信息,标准/本机 Azure Web 应用程序在称为沙盒的安全环境中运行。每个应用程序都在自己的沙箱内运行,将其执行与同一台机器上的其他实例隔离开来,并提供额外的安全性和隐私性,否则这些应用程序将无法使用。

      Azure 应用服务在 Windows 上提供预定义的应用程序堆栈,如 ASP.NET 或 Node.js,在 IIS 上运行。预配置的 Windows 环境会锁定操作系统,使其无法进行管理访问、软件安装、对全局程序集缓存的更改等(请参阅 Azure 应用服务上的操作系统功能)。如果您的应用程序需要比预配置环境允许的更多访问权限,您可以改为部署自定义 Windows 容器。

      符号链接创建:虽然沙盒应用程序可以跟踪/打开现有符号链接,但它们不能在任何地方创建符号链接(或任何其他重解析点)。

      此外,您可以检查文件是否具有只读属性,要检查这一点,请转到 Kudu 控制台 (({yoursite}.scm.azurewebsites.net)) 并运行 attrib somefile.txt,并检查它是否包括 R(只读)属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-29
        • 1970-01-01
        • 2022-01-14
        • 2019-01-07
        • 2021-07-10
        • 1970-01-01
        • 1970-01-01
        • 2015-01-31
        相关资源
        最近更新 更多