【问题标题】:Exception: System.UnauthorizedAccessException, Message: Access to the path "" is denied异常:System.UnauthorizedAccessException,消息:对路径“”的访问被拒绝
【发布时间】:2019-03-04 01:10:09
【问题描述】:

我有以下功能可以进行文本记录,但我一直在错误之下。它不是每次都来,而只是某个时候,而且在 IIS 级别也是如此。发生此错误后,IIS Apppool 将停止。

发生未处理的异常,进程终止。

应用程序 ID:/LM/W3SVC/2/ROOT/OrderHelpDesk

进程 ID:81044

异常:System.UnauthorizedAccessException

消息:对路径“\Ser-file\ErrorLog\2018-09\09_27_2018.txt”的访问被拒绝。

StackTrace:在 OrderHelpDesk.DAL.LogMessage(字符串消息) 在 OrderHelpDesk.ViewPendingOrderDetails.AutoGenMailToCSRProcessed(实体 objEntity) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态) 在 System.Threading.ThreadHelper.ThreadStart()

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();
     }
}

【问题讨论】:

  • 您看到'\Ser-file\ErrorLog\2018-09\09_27_2018.txt' 路径是否正确?此外,iis_user 是否有权读取/写入该文件夹?
  • 是的,那条路径是正确的。 iis_user 对该文件夹有读写权限。问题是,它不是每次都抛出这个错误,而是偶尔,我不知道在什么情况下会发生这种情况。
  • 根据您的标题,我认为您正在获得空白路径。
  • 如果可以,最好使用 Serilog 等日志库。这个问题已经解决了,不用重新实现。

标签: c#


【解决方案1】:

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

如果你不能

这是因为 LogMessage 可以被多个线程同时调用。在这种情况下,一个线程将获得日志文件,而另一个线程将获得 AccessDenied,并且您的池将崩溃,因为 sw 为空,但您调用了 sw.Close()。 使用 synchronization primitivesusing 构造(或检查 sw 是否为空 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);
         }  
   }
}

【讨论】:

  • 它也可能发生,因为另一个进程正在锁定文件。 Determining the locking process is possible.
  • @UweKeim 即使它不应该使 IIS 池崩溃,我认为您不需要编写复杂的逻辑来确定谁在锁定。在这种情况下,最好创建另一个文件。
  • @Access Denied,感谢您的回答。对于我可以使用上述代码的快速解决方案,从长远来看,我可以切换到 NLog,因为这将解决与日志记录相关的所有问题。
【解决方案2】:

可能是文件/文件夹权限的问题。

【讨论】:

    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    相关资源
    最近更新 更多