这是一个有点棘手的问题,所以请耐心等待...
我有一个简单的小方法:
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
我很欣赏该方法没有显示如何使用流,但细节无关紧要,我将在下面解释。
该方法紧贴在类库中;我们在各种其他项目中引用的Helper 。显然,在大多数情况下,假设路径有效、可访问等,代码应该看起来不错。
现在,问题。我有一个 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 , String msgPath, Boolean bFromProxy, Boolean useLongPath) at 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) in其余的异常是指向方法、程序集、wcf 服务等的堆栈跟踪"
现在,我尝试诊断问题的清单(包括愚蠢的明显步骤):
将堆栈跟踪中列出的路径复制并粘贴到 Windows 资源管理器中(在我的本地计算机和服务器上)以确保文件存在并且可以访问 -->能够访问文件
确保 Windows 服务的帐户对文件有足够的权限来读取 -->有效权限将服务的帐户列为具有完全控制权
将Windows服务的账号改成我的个人管理员账号(临时措施)明显重启服务才能使修改生效 -->同一行代码失败
将包含该文件的目录复制到我的本地计算机,然后针对我的本地计算机运行该服务(我们希望确保托管该文件的 NAS 不是原因)->同一行代码失败
创建一个快速控制台应用程序,将辅助程序集方法中的代码复制粘贴到应用程序中,注入相同的文件路径,在本地运行,然后在服务器上运行(在服务器上,我的意思是使用相同的管理员远程连接到服务器我前面提到的帐户,然后运行它)-->应用程序运行代码没有问题
创建一个控制台应用程序并使用在控制台应用程序中托管 WCF 服务库的批量标准方式。在本地运行应用程序,然后对我指定为控制台应用程序基地址的本地地址使用WcfStorm ,使用正常服务失败的相同路径调用相同的方法 --> WcfStorm 的结果确认代码没有问题
仔细检查 WCF 服务库的代码,以确保没有任何特殊的条件逻辑会影响我的测试 -->几乎在服务操作实现开始后(就在参数验证之后)立即调用 Helper 方法。如果不通过辅助方法运行,操作就不可能返回一致的结果,所以当我之前收到一致的结果并假设“奇怪”的文件访问代码已经运行时,它实际上已经运行了
重新部署服务,干净重建 Windows 服务主机、WCF 服务库和 Helper 程序集(想确保我屏幕上的代码实际上是在服务器上运行的代码)-->没有变化
编辑 2011-06-24 16:32GMT - 使用我之前创建的控制台应用程序来托管 WCF 服务,相应地调整 baseAddress 并部署在服务器上。使用与上述相同的管理员帐户运行应用程序。使用 WcfStorm 在新基址上测试新应用。-->代码按预期工作并返回良好结果(我相信在这个阶段将其缩小为 Windows 服务的错误?)
编辑 2011-06-27 10:21GMT - 创建一个简单的 Windows 服务,引用帮助类。安装在服务器上,服务的账号设置为和Live Server一样。-->新服务能够运行代码并访问文件
编辑 2011年 6 月 27 日 10:23 GMT - 很恼火该服务已经工作,我打开了我在周末运行的 WcfStorm。结果是从周五开始显示的剧照,显示现场服务失败。我对同样的请求感到不满 -->它奏效了……我现在实际上更生气了,因为我没有真正的方法来跟踪问题
因此,该服务现在可以正常工作。任何人都知道什么会导致这种间歇性失败?同事们向我保证,周末没有任何改变(至少没有手动改变)。莫名其妙...