C# 异常:System.UnauthorizedAccessException,消息:访问路径&引用;被拒绝
我有下面的功能,它可以记录文本,但我经常会出错。它不是每次都会出现,只是偶尔会出现,在IIS级别也是如此。IIS应用池在此错误后停止 发生未处理的异常,进程终止 应用程序ID:/LM/W3SVC/2/ROOT/OrderHelpDesk 进程ID:81044 异常:System.UnauthorizedAccessException 消息:对路径“\Ser file\ErrorLog\2018-09\09_27_2018.txt”的访问被拒绝 StackTrace:at OrderHelpDesk.DAL.LogMessage(字符串消息) 在OrderHelpDesk.ViewPendingOrderDetails.AutoGenMailToCSRProcessed(实体对象) 位于System.Threading.ExecutionContext.RunInternal(ExecutionContext ExecutionContext、ContextCallback回调、对象状态、布尔值preserveSyncCtx) 在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态,布尔保存SyncCTX) 在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态) 位于System.Threading.ThreadHelper.ThreadStart()处C# 异常:System.UnauthorizedAccessException,消息:访问路径&引用;被拒绝,c#,C#,我有下面的功能,它可以记录文本,但我经常会出错。它不是每次都会出现,只是偶尔会出现,在IIS级别也是如此。IIS应用池在此错误后停止 发生未处理的异常,进程终止 应用程序ID:/LM/W3SVC/2/ROOT/OrderHelpDesk 进程ID:81044 异常:System.UnauthorizedAccessException 消息:对路径“\Ser file\ErrorLog\2018-09\09_27_2018.txt”的访问被拒绝 StackTrace:at OrderHelpDes
使用已经实现的日志库,如 如果你不能 这是因为多个线程可以同时调用LogMessage。在这种情况下,一个线程将获取日志文件,而另一个线程将获取AccessDenied,您的池将崩溃,因为sw为null,但您调用sw.Close()。 使用和构造(或检查sw是否为空sw?.Close()):
使用已经实现的日志库,如 如果你不能 这是因为多个线程可以同时调用LogMessage。在这种情况下,一个线程将获取日志文件,而另一个线程将获取AccessDenied,您的池将崩溃,因为sw为null,但您调用sw.Close()。 使用和构造(或检查sw是否为空sw?.Close()):
可能是文件/文件夹权限问题。可能是文件/文件夹权限问题。您是否看到
'\Ser file\ErrorLog\2018-09\09_27_2018.txt'
路径正确?此外,iis_用户有权读取/写入该文件夹?是的,该路径正确。iis\u用户具有此文件夹的读写权限。问题是,它不是每次都抛出这个错误,但偶尔,我不知道在什么情况下会发生这种情况。根据你的标题,我认为你得到的是空白路径。如果可以,最好使用Serilog之类的日志库。此问题已经解决,您不必重新实现。您是否看到'\Ser file\ErrorLog\2018-09\09\u 27\u 2018.txt'
路径正确?此外,iis_用户有权读取/写入该文件夹?是的,该路径正确。iis\u用户具有此文件夹的读写权限。问题是,它不是每次都抛出这个错误,但偶尔,我不知道在什么情况下会发生这种情况。根据你的标题,我认为你得到的是空白路径。如果可以,最好使用Serilog之类的日志库。这个问题已经解决,您不必重新实现它。它也可能发生,因为另一个进程正在锁定文件@UweKeim即使它不应该使IIS池崩溃,我也不认为您需要编写复杂的逻辑来确定谁在锁定。在这种情况下,最好创建另一个文件。@拒绝访问,谢谢您的回答。对于快速解决方案,我可以使用上述代码,从长远来看,我可以切换为NLog,因为这将解决与日志记录相关的所有问题。这也可能发生,因为另一个进程正在锁定文件@UweKeim即使它不应该使IIS池崩溃,我也不认为您需要编写复杂的逻辑来确定谁在锁定。在这种情况下,最好创建另一个文件。@拒绝访问,谢谢您的回答。对于快速解决方案,我可以使用上述代码,从长远来看,我可以切换为NLog,因为这将解决与日志记录相关的所有问题。
public void LogMessage(string Message)
{
Entity objEntity = new Entity();
StreamWriter sw = null;
try
{
objEntity.LogMessage = string.Format("\r\n{0:MM/dd/yyyy hh:mm:ss tt} : {1}", DateTime.Now, Message);
objEntity.LogFilePath = ConfigurationManager.AppSettings.Get("ErrorLogPath");
objEntity.LogFolderName = string.Format("{0:yyyy-MM}", DateTime.Now);
objEntity.LogFilePath = objEntity.LogFilePath + objEntity.LogFolderName;
if (!Directory.Exists(objEntity.LogFilePath))
{
Directory.CreateDirectory(objEntity.LogFilePath);
}
sw = File.AppendText(objEntity.LogFilePath + "\\" + string.Format("{0:MM_dd_yyyy}", DateTime.Now) + ".txt");
sw.WriteLine(objEntity.LogMessage);
}
catch (Exception Ex)
{
throw Ex;
}
finally
{
sw.Close();
}
}
static object locker = new object();
public void LogMessage(string Message)
{
lock (locker)
{
Entity objEntity = new Entity();
objEntity.LogMessage = string.Format("\r\n{0:MM/dd/yyyy hh:mm:ss tt} : {1}", DateTime.Now, Message);
objEntity.LogFilePath = ConfigurationManager.AppSettings.Get("ErrorLogPath");
objEntity.LogFolderName = string.Format("{0:yyyy-MM}", DateTime.Now);
objEntity.LogFilePath = objEntity.LogFilePath + objEntity.LogFolderName;
if (!Directory.Exists(objEntity.LogFilePath))
{
Directory.CreateDirectory(objEntity.LogFilePath);
}
using (StreamWriter sw = File.AppendText(objEntity.LogFilePath + "\\" + string.Format("{0:MM_dd_yyyy}", DateTime.Now) + ".txt"))
{
sw.WriteLine(objEntity.LogMessage);
}
}
}