从Web应用程序中获取DefaultAppPool的AppData文件夹

6

我有一个运行在DefaultAppPool账户下的Web应用程序。我想把一些文件写入DefaultAppPool的AppData文件夹(或任何其他文件夹,这些文件夹对我的应用程序正在运行的账户是100%可访问的)。

我已经尝试过了:

Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData)

但由于某些原因,它返回了一个空字符串。

Environment.GetFolderPath(System.Environment.SpecialFolder.UserProfile)

按预期返回C:\\Users\DefaultAppPool

如何获取DefaultAppPool的AppData路径?

编辑:此代码在模型中执行。


2
尽管磁盘上有DefaultAppPool的用户目录,但在运行AppPool时,“用户”的配置文件并没有加载,这就是为什么Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData)为空,也正因此你会得到systemprofile。hutchonoid的解决方案似乎可行,但我实际上建议不要在AppPool身份用户的用户目录中存储任何永久数据。如果某个管理员决定更改AppPool的身份,那该怎么办?对于临时数据,您可以始终依赖于%temp%。 - Peter Hahndorf
我总是为任何应用程序设置一个父目录,在其下是文档根本身(对于IIS中的物理路径),但我还有其他目录,用于存储日志、下载或数据,这些目录应该可以被我的应用程序访问,但不能直接浏览。您只需要确保AppPool用户帐户具有足够的NTFS权限即可。如果您无法更改目录结构,则可以使用APP_Data或在文档根目录下创建另一个文件夹,并使其对浏览器不可访问(您可以在IIS中的请求筛选中使用隐藏段)。 - Peter Hahndorf
@PeterHahndorf 问题在于,如果有人卸载了我的应用程序并删除了安装文件夹,则试用信息也将被清除。这就是为什么我考虑使用Web应用程序的用户目录,因为无论在哪个帐户下执行该应用程序,它都将始终具有在那里写入的权限。 - VladL
@VladL - 我明白,你正在尝试在某个地方编写一些试用/许可信息,最好是在客户无法更改的地方,对吗?这是一个完全不同的问题,但我认为用户目录不是一个好的选择。 - Peter Hahndorf
@PeterHahndorf 对,但为什么不呢?这不是已登录用户的目录,而是Web应用程序用户的目录,通常是DefaultAppPool。 - VladL
显示剩余6条评论
2个回答

1
我是这样做的:

var path = string.Format("{0}\\{1}", Environment.GetFolderPath(System.Environment.SpecialFolder.UserProfile), "AppData")

+1 它可以工作,但对我来说看起来有点像硬编码字符串。 - VladL
完全同意,+1个问题。我只能得到ApplicationData文件夹的返回值,但我放弃了,但我很想知道是否有人有完整的答案。 :) - hutchonoid

0
我是这样做的:
string apPath = Path.Combine(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath, "App_Data");

晚来了,但OP想要访问IIS AppPool用户的应用程序数据文件夹,而不是Web根目录中的App_Data文件夹。 - Hakan Yildizhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接