【问题标题】:Wrong path returned by Environment.GetFolderPath(Environment.SpecialFolder.ApplicationFolder) under IIS6 WebServiceIIS6 WebService下Environment.GetFolderPath(Environment.SpecialFolder.ApplicationFolder)返回的路径错误
【发布时间】:2011-04-26 00:15:00
【问题描述】:

在我运行的测试机器(Windows XP、IIS5.1)上,以下代码在自定义进程标识下的 C# .NET WebService (.SVC) 中执行(使用 machine.config 指定用户)

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

正确返回

c:\Documents and Settings\myUserName\Application Data

但是,在(终端服务)Windows 2003 机器上运行 IIS6 并执行相同的代码,但现在使用 ApplicationPool 来指定方法返回的相同进程标识:

c:\Documents and Settings\Default User\Application Data

我在 Win2003/IIS6 机器上运行时检查的内容:

  1. myUserName 属于组 IIS_WPG(甚至尝试过 Admin)
  2. 对 Environment.UserName 的调用正确返回 myUserName
  3. Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);的调用也会返回一个“默认用户”路径,与DesktopDirectory类似
  4. 以 myUserName 身份登录并确保 C:\Documents and settings\myUserName 存在
  5. 在 Windows 2003 机器上的 .net 应用程序中运行完全相同的代码,这可以正常工作并返回正确的路径。

我很困惑,只有在 IIS6 下运行时才会出现。几乎就像它认为呼叫来自 Network ServiceLocal System 用户,并且它没有检查运行应用程序池的身份。

顺便说一下,当我查看 Procmon 并查看从 web 服务调用的 C++ 应用程序时,它在读取和写入 C:\Documents and settings\myUserName\ApplicatonData 时没有这样的问题,它没有似乎有问题,也许它构建的路径不同。

我开始认为这可能是 .NET 中的一个错误??

谢谢。

汤姆·德洛福德

【问题讨论】:

  • 这绝对不是错误。
  • 你说得对,这是设计使然。
  • 我遇到了相同的问题路径,返回的是我客户的一台计算机上的不同用户。我的是一个 Windows 窗体应用程序 C# .Net 2.0 和 3.5

标签: c# .net web-services iis-6


【解决方案1】:

解决了。显然这是“设计使然”,因为 IIS6 不加载用户配置文件设置。

Microsoft 建议我先升级到 IIS7 或调用 LoadUserProfile,我想知道是什么让他们从 IIS5.1 更改该功能。

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/890fa85a-b11a-4fbe-a333-cbe69abd72a7

无论如何吸取教训,不要假设功能没有被删除,并且总是使用相同的应用程序服务器进行测试,即使 IT 部门会感到厌烦!

【讨论】:

  • 这不是 IIS 问题。我在我的一台客户端机器上的 Windows 窗体应用程序 C# windows Vista SP2 上面临同样的问题
【解决方案2】:

是的。这不是错误。 应用程序池在哪个用户下运行??

让我们稍微拆分一下:

测试机使用 IIS 托管服务还是内置 Web 服务器? 如果您使用内置的 Web 服务器,它会在您的用户下运行。 如果使用 IIS,池用户是哪一个?

如果是网络服务或本地系统,则进程在其中一个用户的上下文中运行,实际上,调用:

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) 

没问题。

您应该更改池的用户(并回收池)以查看更改。

【讨论】:

  • 如问题中所述,我正在使用应用程序池来设置进程所有者。在 taskmanager 中,我可以看到该进程正在该用户下运行,并且如问题中所述,对 Envornment.UserName 的调用返回正确的用户名,但 Envorment.GetFolderPath 没有,它必须是 TS/IIS6 或 .NET 的错误或者也许只是当所有三个一起运行时。如前所述,IIS6 未内置在 Web 服务器中。
  • 在 MSDN 上,我刚刚被建议升级到 IIS7,因为 IIS6 不加载用户配置文件设置。感谢您的帮助。
猜你喜欢
  • 2011-11-04
  • 2019-03-19
  • 1970-01-01
  • 2013-11-15
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多