我遇到了一个问题,似乎无法解决。 我们有一个可以处理某些请求的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上。
现在问问题:
这是由发布应用程序引起的,并且文件夹未包含在发布文件中吗?
如果是,我将如何解决此问题,以便包括文件夹和后续文件?我宁愿不手动创建文件夹和文件,因为我认为这些应该包含在项目中
如果否,这可能是什么原因?感染文件时,我可以在错误的位置查看吗?
答案 0 :(得分:1)
如果要在“经典” ASP.Net下找到应用程序文件夹,则需要使用MapPath
函数。 (此概念是从“经典经典ASP”复制而来的。)
在asp.net Core下,您应该将IHostingEnvironment
注入到要查找文件路径的位置。
除非在启动后立即进行查询,否则(在任何系统,asp,控制台等中)切勿假设Environment.CurrentDirectory
指向任何有用的地方。 (在asp.net中,您的中的任何代码都与实际的启动代码完全脱离了)