gpt4 book ai didi

vb.net - System.UnauthorizedAccessException - 拒绝访问路径

转载 作者:行者123 更新时间:2023-12-04 02:17:44 38 4
gpt4 key购买 nike

这是一个有点棘手的问题,所以请耐心等待......
我有一个简单的小方法:

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
我很欣赏该方法没有显示如何使用流,但细节无关紧要,我将在下面解释。
该方法紧贴在类库中;我们在各种其他项目中引用的助手。显然,在大多数情况下,假设路径有效、可访问等,代码应该看起来不错。
现在,问题。我有一个 WCF 服务库,它在 Helper 程序集中引用和使用上述方法。 WCF 服务库托管在 Windows 服务中,该服务又驻留在我们的一台服务器上。 WCF 服务有一个操作,它接收文件的 UNC 路径,并在正常流程中调用 Helper 类中的上述方法。
我发送的路径是用于我们网络上共享上的文件。 “Using fs As...”行失败,但出现以下异常:
System.UnauthorizedAccessException:拒绝访问路径“我的文件路径在此处列出”。在 System.IO.__Error.WinIOError(Int32 errorCode, String MaybeFullPath) 在 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs , 字符串 msgPath, Boolean bFromProxy, Boolean useLongPath) 在 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) at System.IO.FileStream ..ctor(String path, FileMode mode) at MyHelperAssemblyName.DoStuff(String filePath) 在异常的其余部分是指向方法、程序集、wcf 服务等的堆栈跟踪”
现在,我尝试诊断问题的 list (包括愚蠢的明显步骤):
  • 将堆栈跟踪中列出的路径复制并粘贴到 Windows 资源管理器(在我的本地计算机和服务器上)以确保该文件存在且可访问 --> 能够访问该文件
  • 确保 Windows 服务的帐户对文件具有足够的读取权限 --> 有效权限将服务的帐户列为具有完全控制权
  • 将windows服务的账号改成我的个人admin账号(临时措施),明显重启服务使更改生效 --> 同一行代码失败
  • 将包含文件的目录复制到我的本地机器,并在我的本地机器上运行该服务(我们希望确保托管文件的 NAS 不是原因)--> 同一行代码失败
  • 创建一个快速控制台应用程序,将辅助程序集方法中的代码复制粘贴到应用程序中,注入(inject)相同的文件路径,在本地运行,然后在服务器上运行(在服务器上,我的意思是使用相同的管理员远程连接到服务器前面提到的账号,然后运行) --> 应用程序运行代码没有问题
  • 创建一个控制台应用程序并使用 bulk standard在控制台应用程序中托管 WCF 服务库的方式。在本地运行应用程序,然后使用 WcfStorm针对我指定为控制台应用程序基地址的本地地址,使用正常服务失败的相同路径调用相同的方法 --> WcfStorm 的结果确认代码没有问题
  • 仔细检查 WCF 服务库的代码以确保没有任何特殊的条件逻辑会影响我的测试 --> 在服务操作实现开始后(就在参数验证之后)几乎立即调用 Helper 方法。如果不运行辅助方法,操作就不可能返回一致的结果,所以当我之前接收到一致的结果并假设“奇怪的”文件访问代码已经运行时,它实际上已经运行
  • 使用 Windows 服务主机、WCF 服务库和帮助程序集的干净重建重新部署服务(希望确保我屏幕上的代码实际上是服务器上运行的代码)--> 无更改
  • 编辑 2011-06-24 16:32GMT - 使用我之前创建的控制台应用程序来托管 WCF 服务,相应地调整 baseAddress 并在服务器上部署。使用与上述相同的管理员帐户运行应用程序。使用 WcfStorm 在新基地址上测试新应用。 --> 代码按预期工作并返回良好的结果(我相信在此阶段将其缩小为 Windows 服务的错​​?)
  • 编辑 2011-06-27 10:21GMT - 创建一个简单的 Windows 服务,引用帮助器类。安装在Server上,服务的账号设置为和Live Server一样。 --> 新服务能够运行代码并访问文件
  • 编辑 2011-06-27 10:23GMT - 对服务有效感到恼火,我打开了我在周末运行的 WcfStorm。结果从周五开始显示,显示现场服务失败。我反驳了同样的请求 --> 它奏效了……我现在更生气了,因为我没有真正的方法来跟踪问题
    因此,该服务现在可以正常工作。任何人都知道什么会导致这种间歇性失败?同事们向我保证,周末没有任何变化(至少不是手动更改)。一头雾水...
  • 最佳答案

    试试 process monitor .它将向您显示正在访问该文件的用户以及正在返回的特定 Windows 错误代码。然后您应该能够看到为什么它适用于某些文件而不适用于其他文件。

    关于vb.net - System.UnauthorizedAccessException - 拒绝访问路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6469608/

    38 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com