【问题标题】:Azure static files System.IO.DirectoryNotFoundExceptionAzure 静态文件 System.IO.DirectoryNotFoundException
【发布时间】:2018-12-01 13:55:01
【问题描述】:

我有一个在 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 中存储和检索电子邮件模板(和其他静态文件)的正确方法是什么?

【问题讨论】:

  • 你确定你的静态文件是部署的一部分吗? (复制到输出文件夹-> 总是)?本地相对路径“资源”是您项目的一部分吗?
  • 原来是这样。拜托,你能写一个答案,让我接受吗?
  • 我已经更新了答案

标签: c# azure asp.net-core


【解决方案1】:

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

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

【讨论】:

  • 我必须明确地“发布”这些 html 文件并设置上述内容,然后它们才会出现并工作。
【解决方案2】:

当我们将 .Net Core Web 应用程序发布到 azure 时,它​​的所有内容都放在此路径 [D:\home\site\wwwroot] 下,静态文件除外。

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

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

我们可以通过KUDU查看我们项目在azure中的目录信息:Using KUDU with Microsoft Azure Web Apps

更新:

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

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

【讨论】:

【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 2015-10-30
    • 1970-01-01
    • 2020-08-02
    • 2017-12-30
    • 2016-05-17
    相关资源
    最近更新 更多