IIS System.IO.DirectoryNotFoundException

时间:2018-08-01 07:15:16

标签: c# iis .net-core publishing

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

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

我已经在localhost上进行了广泛的测试,这里一切正常。将应用程序发布到我们的IIS之后,问题开始了。

我第一次致电控制器以发送电子邮件会返回此错误:

{
    "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上。

现在问问题:

  • 这是由发布应用程序引起的,并且文件夹未包含在发布文件中吗?

  • 如果是,我将如何解决此问题,以便包括文件夹和后续文件?我宁愿不手动创建文件夹和文件,因为我认为这些应该包含在项目中

  • 如果否,这可能是什么原因?感染文件时,我可以在错误的位置查看吗?

1 个答案:

答案 0 :(得分:1)

如果要在“经典” ASP.Net下找到应用程序文件夹,则需要使用MapPath函数。 (此概念是从“经典经典ASP”复制而来的。)

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

除非在启动后立即进行查询,否则(在任何系统,asp,控制台等中)切勿假设Environment.CurrentDirectory指向任何有用的地方。 (在asp.net中,您的中的任何代码都与实际的启动代码完全脱离了)