System.UnauthorizedAccessException - 拒绝访问路径

Smu*_*202 11 vb.net wcf windows-services .net-4.0 access-denied

这是一个有点棘手的问题,所以请耐心等待......

我有一个简单的小方法:

Public Overloads Shared Function DoStuff(ByVal path As String) As Boolean
        If Not IO.File.Exists(ipath) Then Throw New ArgumentException

        Dim result As Boolean
        Using fs As FileStream = New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)
            ' do stuff here, details are not important
            fs.Close()
        End Using

        Return result
    End Function
Run Code Online (Sandbox Code Playgroud)

我很欣赏该方法没有显示如何使用流,但细节是无关紧要的,我将在下面解释.

这种方法在类库中很贴心; 我们在各种其他项目中引用的助手.显然,在大多数情况下,代码应该在假设路径有效,可访问等方面看起来很好.

现在,问题.我有一个WCF服务库,它引用并使用Helper程序集中的上述方法.WCF服务库托管在Windows服务中,而Windows服务又驻留在我们的某个服务器上.WCF服务有一个操作,它接收文件的UNC路径,在正常流程中,调用Helper类中的上述方法.

我发送的路径是用于我们网络上的共享文件."使用fs As ..."行失败,但出现以下异常:

System.UnauthorizedAccessException:拒绝访问" 此处列出的文件路径" 路径.在System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)at System.IO.FileStream.Init(String path,FileMode mode,FileAccess access,Int32 rights,Boolean useRights,FileShare share,Int32 bufferSize,FileOptions options,SECURITY_ATTRIBUTES secAttrs) System.IO.FileStream上的System.IO.FileStream..ctor(String path,FileMode mode,FileAccess访问,FileShare共享,Int32 bufferSize,FileOptions选项,String msgPath,Boolean bFromProxy)中的,String msgPath,Boolean bFromProxy,Boolean useLongPath) MyHelperAssemblyName.DoStuff(String filePath)中 ..ctor(字符串路径,FileMode模式),其余异常是指向方法,程序集,wcf服务等的堆栈跟踪 "

现在,我尝试诊断问题的列表(包括愚蠢明显的步骤):

  • 将堆栈跟踪中列出的路径复制并粘贴到Windows资源管理器中(在我的本地计算机和服务器上)以确保文件存在且可访问 - > 能够访问文件
  • 确保Windows服务的帐户具有足够的文件读取权限 - > 有效权限将服务的帐户列为具有完全控制权限
  • 更改Windows服务的帐户以使用我的个人管理员帐户(临时措施)并显然重新启动服务以使更改生效 - > 同一行代码失败
  • 将包含该文件的目录复制到我的本地计算机,并针对我的本地计算机运行该服务(我们希望确保承载该文件的NAS不是原因) - > 同一行代码失败
  • 创建一个快速控制台应用程序,将帮助程序集的方法中的代码粘贴到应用程序中,注入相同的文件路径,在本地运行然后在服务器上运行(在服务器上,我的意思是使用相同的Admin远程连接到服务器我之前提到的帐户,并运行它) - > 应用程序运行代码没有问题
  • 创建控制台应用程序,并使用在控制台应用程序中托管WCF服务库的批量标准方式.在本地运行应用程序,然后使用WcfStorm对照我指定为控制台应用程序的基本地址的本地地址,使用与正常服务失败相同的路径调用相同的方法 - > WcfStorm的结果确认代码没有问题
  • 仔细检查WCF服务库的代码,以确保没有任何可能影响我的测试的特殊条件逻辑 - > 在服务操作实现开始之后(仅在参数验证之后)几乎立即调用Helper方法.如果没有运行辅助方法,操作就不可能返回连贯的结果,所以当我以前收到连贯的结果并假设已经运行了"怪异的"文件访问代码时,它实际上已经运行了
  • 使用Windows服务主机,WCF服务库和帮助程序程序集的干净重建重新部署服务(希望确保我的屏幕上的代码实际上是服务器上运行的代码) - > 没有更改
  • 编辑2011-06-24 16:32GMT - 使用我之前创建的控制台应用程序来托管WCF服务,相应地调整baseAddress并在服务器上部署.使用与上述相同的管理员帐户运行该应用.使用WcfStorm在新的基地址上测试新应用程序.- > 代码按预期工作并返回良好的结果(我相信在这个阶段将其缩小为Windows服务的错误?)
  • 编辑2011-06-27 10:21GMT - 创建一个简单的Windows服务,引用辅助类.安装在服务器上,该服务的帐户设置为与Live Server相同.- > 新服务能够运行代码并访问该文件
  • 编辑2011-06-27 10:23GMT - 我觉得服务工作很烦恼,我拉开了WcfStorm,这是我周末跑的.从周五开始显示结果显示实时服务失败.我怨恨同样的要求 - > 它有效...我现在实际上更生气,因为我没有真正的方法来追踪这个问题

    所以,该服务现在正常工作.任何人有什么想法会导致这种间歇性的失败?同事们向我保证,周末没有任何改变(至少不是手动).百思不得其解......

小智 1

当我的代码访问尚未完全写入磁盘的新文件时,我遇到了类似的情况。所以等待几毫秒就解决了我的问题。您是否有可能在将流完全写入磁盘之前尝试读取该流?