C# Azure应用程序服务中的文件系统问题-无法创建目录
我们在生产环境中的Azure应用程序服务(Windows机器)中托管了一个dotnet核心应用程序。它由两部分组成-C# Azure应用程序服务中的文件系统问题-无法创建目录,c#,azure,asp.net-core,azure-web-app-service,C#,Azure,Asp.net Core,Azure Web App Service,我们在生产环境中的Azure应用程序服务(Windows机器)中托管了一个dotnet核心应用程序。它由两部分组成- 电子邮件服务 业务规则引擎 电子邮件服务首先将所有电子邮件下载到应用程序所在目录(D:\home\wwwroot\)中的文件夹附件中。对于每封电子邮件,将在附件目录下创建一个单独的目录(带有guid值) 业务规则引擎访问该文件夹并使用电子邮件及其附件。完成后,我们将清除附件目录中的所有内容 我们看到的问题是,在处理了一定数量的电子邮件之后,我们的应用程序突然无法在附件文件夹下
- 电子邮件服务
- 业务规则引擎
D:\home\wwwroot\
)中的文件夹附件中。对于每封电子邮件,将在附件
目录下创建一个单独的目录(带有guid值)
业务规则引擎访问该文件夹并使用电子邮件及其附件。完成后,我们将清除附件
目录中的所有内容
我们看到的问题是,在处理了一定数量的电子邮件之后,我们的应用程序突然无法在附件
文件夹下创建目录。声明
Directory.CreateDirectory({path})
抛出一个错误,说明找不到指定的路径
我们能够解决这个问题的唯一方法是重新启动应用程序服务,它再次愉快地继续创建目录,处理电子邮件,直到它在一天左右再次失败-|
我们试过的-
- 我们的应用程序是多线程的,所以假设可能有一个线程由于不正确或不完整的资源处理而在文件系统上持有锁,我们将其改为单线程处理
- 在创建目录的地方,我们使用了
DirectoryInfo
,因此在每次删除、创建目录后都尝试使用DirectoryInfo.Refresh()
- 无论在哪里使用
FileStream
,我们都添加了显式的.Dispose()
语句来处理FileStream
- 在每次服务运行结束时调用
GC.Collect()
我怀疑此问题是由于Azure环境造成的,但我们无法确定是什么导致了此问题。有人有过这样的问题吗?如果有,是如何解决的?是的,根据您的问题描述,这看起来确实是一个沙箱限制。为了提供更多信息,标准/本机Azure Web应用程序在称为沙箱的安全环境中运行。每个应用程序都在自己的沙箱中运行,将其执行与同一台机器上的其他实例隔离开来,并提供了额外的安全性和隐私性,否则将无法使用
Azure应用程序服务在Windows上提供预定义的应用程序堆栈,如在IIS上运行的ASP.NET或Node.js。预配置的Windows环境将操作系统从管理访问、软件安装、全局程序集缓存更改等方面锁定(请参阅Azure应用程序服务上的操作系统功能)。如果应用程序需要比预配置环境允许的更多的访问权限,则可以部署自定义Windows容器
符号链接创建:沙盒应用程序可以跟随/打开现有符号链接,但不能在任何地方创建符号链接(或任何其他重分析点)
此外,您可以检查文件是否具有只读属性,要检查此属性,请转到Kudu控制台({yoursite}.scm.azurewebsites.net))并运行attrib somefile.txt,并检查它是否包含R(只读)属性。我根据我在这些链接中所读到的内容对代码进行了一些更改,这些内容很好地总结了Azure应用程序服务中的存储系统-
D:\local
目录指向一个只有该服务实例才能访问的文件夹,而不是我之前使用的在实例之间共享的文件夹-D:\home
因此,我更改了代码以解析%Temp%
环境变量,该变量解析为D:\local\Temp
,然后使用该位置存储下载的电子邮件
到目前为止,已经执行了多次测试运行,没有任何与文件系统相关的异常