Azure静态文件System.IO.DirectoryNotFoundException

时间:2018-06-22 06:33:28

标签: c# azure asp.net-core

我有一个在Azure上运行的ASP.NET Core应用程序。该应用程序以明文和HTML格式发送各种电子邮件。我在Resources文件夹中创建了一个子文件夹,名为EmailTemplates,在其中存储了所有HTML和TXT模板。示例路径可能是:

\src\WebProject\Resources\EmailTemplates\Welcome.html

我通过以下方式访问EmailService.cs类中的文件:

var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Resources", "EmailTemplates", "Welcome.html");
var htmlTemplate = await File.ReadAllTextAsync(filePath);

当在IIS和Kestrel上的本地环境上运行时,这非常有用。但是,当部署到Azure时,我收到一条IO错误消息:

System.IO.DirectoryNotFoundException
An unhandled exception has occurred: Could not find a part of the path 'D:\home\site\wwwroot\Resources\EmailTemplates\Welcome.html'.

我在StackOverflow上发现了类似的问题,但是the answer快6岁了。我不确定,自从Azure在过去几年中发生重大变化以来,它是否仍然适用。我还查看了官方文档(1) (2),但没有发现有关Azure的任何特殊信息。

在ASP.NET Core和Azure中存储和检索电子邮件模板(和其他静态文件)的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

确保您的静态文件是项目的一部分。

并将它们明确标记为内容,并始终标记为Copy to output folder->。

答案 1 :(得分:0)

当我们将.Net Core Web应用发布为Azure时,除静态文件外,其所有内容都放置在此路径[D:\ home \ site \ wwwroot]下。

根据您的描述,我们需要在项目的wwwroot下创建Resources文件夹。然后,在发布到天蓝色后,我们可以使用以下代码访问文件:

var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "Resources", "EmailTemplates", "Welcome.html");

我们可以通过KUDU以天蓝色查看我们项目的目录信息:Using KUDU with Microsoft Azure Web Apps

更新

我们需要允许将Resources文件夹复制到csproj文件的发布目录,如下所示:

<Content Include="Resource\*">
  <CopyToPublishDirectory>always</CopyToPublishDirectory>
</Content>

enter image description here

答案 2 :(得分:0)

无论文件在项目中的什么位置,如果在属性中将文件设置为“嵌入式资源”和“如果更新则复制”,则在发布时将创建文件夹和文件!

enter image description here