C# Directory.Exists()奇怪的行为

C# Directory.Exists()奇怪的行为,c#,.net,wcf,iis,C#,.net,Wcf,Iis,我有一个IIS托管的WCF服务,我正在尝试使用Directory.Exists()方法。如果传递了不存在的网络位置,此方法将挂起。我在谷歌上搜索了一下,发现由于Directory.Exists()internal实现,它“还可以”。但是我编写了一个简单的控制台应用程序,它执行相同的操作,并且Directory.Exists()从不挂起,总是返回“false”。我在我的(管理员)帐户下运行应用程序,IIS池在“网络服务”下运行。 你知道为什么吗?在服务或控制台应用程序中执行相同操作有什么区别?这可

我有一个IIS托管的WCF服务,我正在尝试使用
Directory.Exists()
方法。如果传递了不存在的网络位置,此方法将挂起。我在谷歌上搜索了一下,发现由于
Directory.Exists()
internal实现,它“还可以”。但是我编写了一个简单的控制台应用程序,它执行相同的操作,并且
Directory.Exists()
从不挂起,总是返回“
false
”。我在我的(管理员)帐户下运行应用程序,IIS池在“网络服务”下运行。

你知道为什么吗?在服务或控制台应用程序中执行相同操作有什么区别?

这可能是由于Windows中存在用户授权控制内容造成的(还记得当您尝试访问Windows中没有访问权限的文件夹时,需要等待很长时间才能回答“您无法访问…”之类的问题)

运行应用程序的用户是谁? 您的用户id(根据您所说的,您可以访问运行控制台应用程序的文件夹)能够看到该文件夹

因此,尝试以您自己的用户id运行应用程序


此外,请检查此链接:

您确定应用程序正在作为网络服务运行吗?本地网络服务帐户将无法访问网络。

使用UNC路径而不是映射的网络驱动器,因为映射的驱动器特定于您的用户帐户。另外,正如KMan指出的,确保应用程序池标识可以访问UNC路径目标

请访问此链接:


谢谢。

这里的关键是如何在网络服务上运行,而不是使用管理员帐户

你知道后者可以访问网络位置,但你不确定前者是否可以

下面是一个示例,您可能希望有访问权限,但它实际上不起作用:

具有共享驱动器的计算机不在域上这一事实是您的主要问题所在


你是如何发现悬挂的?“您的IIS运行在哪个信任级别?”Grumbler85我可以看到,使用调试器和日志记录(实际上在方法调用时停止)。我在IIS 7.5上运行服务,未更改信任级别设置。您可以尝试在IIS中以本地系统的形式临时运行应用程序池服务-如果在本地系统下运行正常,您将知道它与权限相关。您如何确定此方法确实导致服务挂起?这个方法的文档表明它不会抛出任何异常,所以如果这是罪魁祸首,我会非常惊讶。你是否打开了WCF日志记录,因为这可能会帮助你指出问题所在。我认为重要的不是“服务vs控制台应用”,而是“网络服务vs管理员帐户”。网络服务设计限制了权限,可能无法访问网络共享。您可以尝试为应用程序池使用不同的标识;有权访问网络的人。