Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异常:System.UnauthorizedAccessException,消息:访问路径&引用;被拒绝_C# - Fatal编程技术网

C# 异常:System.UnauthorizedAccessException,消息:访问路径&引用;被拒绝

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

我有下面的功能,它可以记录文本,但我经常会出错。它不是每次都会出现,只是偶尔会出现,在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()处


使用已经实现的日志库,如

如果你不能

这是因为多个线程可以同时调用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);
         }  
   }
}