.net 将杂项文件放在bin目录中是个坏主意
我有一个程序集,其中包含一个可以从IIS或控制台应用程序调用的函数 因此,我选择了以下方法来获取路径:.net 将杂项文件放在bin目录中是个坏主意,.net,asp.net,iis,.net,Asp.net,Iis,我有一个程序集,其中包含一个可以从IIS或控制台应用程序调用的函数 因此,我选择了以下方法来获取路径: System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) 显然,在从IIS调用函数的情况下,这将返回bin目录 我打算在此路径上创建一个txt文件。将文本文件放在bin目录中是一个坏主意吗?请给出有效的反对意见(如果有),说明这可能导致问题的原因。您可能没有足够的权限
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)
显然,在从IIS调用函数的情况下,这将返回bin目录
我打算在此路径上创建一个txt文件。将文本文件放在bin目录中是一个坏主意吗?请给出有效的反对意见(如果有),说明这可能导致问题的原因。您可能没有足够的权限写入此目录。尝试改用
TEMP
文件夹(想想Path.GetTempPath()
)。如果删除/复制/覆盖“bin”目录中的文件,IIS将重新启动进程-因为IIS认为应用程序已更改,所以新的请求应使用“新建”应用程序操作进行
因此,yes这是个坏主意。
Assembly.Location
可能会返回令人惊讶的结果,例如,如果启用了卷影复制(例如,在通过NUnit运行时),或者从不在本地文件系统上的位置运行时(可以通过HTTP运行.NET应用程序)
AppDomain.CurrentDomain.BaseDirectory
是一个更安全的选项,因为它在卷影复制之前返回原始路径(尽管在HTTP部署的情况下,我认为它返回ieexec.exe
所在的目录)
最安全的选择是将所需的任何数据作为资源嵌入程序集中,并使用
assembly.GetManifestResourceStream
在运行时访问它。蒂姆·罗宾逊的想法是正确的
我要说的另一件事是,如果ASP.NET正在编写文件,请小心线程代码;可能对同一页的两个请求会试图同时写入同一个文件,因此请小心锁定对该文件的写入。的确,因此,对其中任何文件的任何更改都将导致IIS重置?我认为这只是对DLL和web.configAny文件的更改导致IIS重置-因为程序集可以有任何扩展名或没有扩展名,或者文件不是程序集,但可以是应用程序的一部分。理想情况下,使用System.IO.Path.GetTempPath()命令事实上,这是一个很好的建议,我唯一不喜欢的是临时目录是一个模糊的位置,而且还受到外部力量的影响(比如管理员清理它)