IIS System.IO.DirectoryNotFoundException

IIS System.IO.DirectoryNotFoundException

我 运行 遇到了一个我似乎无法解决的问题。 我们有一个 api 来处理某些请求。当这些请求失败时,我们的 api 应该会向某些人发送电子邮件以通知他们这个问题。

为此,我在我们的项目中创建了一个新文件夹,并编写了几个 .html 文件(模板)用于发送电子邮件。这些具有某些字段,这些字段会根据调用的函数和可能发生的错误动态填充。

我已经在本地主机上对此进行了相当广泛的测试,这里一切正常。将应用程序发布到我们的 IIS 后,问题就开始了。

我第一次打电话给控制器发送电子邮件returns这个错误:

{
    "ClassName": "System.IO.DirectoryNotFoundException",
    "Message": "Could not find a part of the path 'C:\inetpub\wwwroot\API\HtmlTemplates\LastCodeTemplate.html'.",
    "Data": null,
    "InnerException": null,
    "HelpURL": null,
    "StackTraceString": "   at System.IO.FileStream.OpenHandle(FileMode mode, FileShare share, FileOptions options)\r\n   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)\r\n   at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)\r\n   at API.Core.Services.Service1.<GetLastCodeTemplate>d__5.MoveNext() in C:\Users\User\Documents\Projects\API\API\Core\Services\Service1.cs:line 90\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at API.Core.Services.Service2.<SendProblemEmail>d__6.MoveNext() in C:\Users\User\Documents\Projects\API\API\Core\Services\Service2.cs:line 101\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at API.Core.Services.Service3.<SendEmail>d__10.MoveNext() in C:\Users\User\Documents\Projects\API\API\Core\Services\Service3.cs:line 311\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at API.Controllers.Controller2.<SendEmail>d__4.MoveNext() in C:\Users\User\Documents\Projects\API\API\Controllers\Controller2.cs:line 51",
    "RemoteStackTraceString": null,
    "RemoteStackIndex": 0,
    "ExceptionMethod": null,
    "HResult": -2147024893,
    "Source": "System.Private.CoreLib",
    "WatsonBuckets": null
}

从文件夹中获取模板的代码:

public async Task<string> GetLastCodeTemplate(string startDate, string endDate)
{
    string body;
    var logo = _config["Logo:logoUrl"];
    var currentFolder = Environment.CurrentDirectory;

    using (var reader = new StreamReader(currentFolder + @"\HtmlTemplates\LastCodeTemplate.html"))
    {
        body = await reader.ReadToEndAsync();
    }

    body = body.Replace("{startDate}", startDate);
    body = body.Replace("{endDate}", endDate);
    body = body.Replace("{logo}", logo);

    return body;
}

错误很明显,api找不到指定位置的文件夹。我已经检查过,但我们的 IIS 上没有该文件夹。

现在回答问题:

如果要查找应用程序文件夹,请在 "classic" ASP.Net 下查找 MapPath 函数。 (此概念复制自 "classic classic ASP")。

在 asp.net 核心下,您应该将 IHostingEnvironment 注入到您想要查找文件路径的位置。

你永远不应该(在任何系统、asp、控制台等)假定 Environment.CurrentDirectory 点在任何有用的地方,除非你在启动后立即查询它。 (在 asp.net 中,任何 你的 代码都与实际的启动代码完全脱节)