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 中,任何 你的 代码都与实际的启动代码完全脱节)
我 运行 遇到了一个我似乎无法解决的问题。 我们有一个 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 中,任何 你的 代码都与实际的启动代码完全脱节)