我在AppDomains的卷影复制功能与在IIS下运行的ASP.NET网站相结合时遇到了一些麻烦。问题是,由于权限不足,IIS用户无法读取或执行卷影复制的文件。
执行新AppDomain中的代码时,我收到以下错误消息(通过DoCallBack的回调方法):
System.IO.FileLoadException:无法加载文件或程序集“My.Namespace.AssemblyName,Version = 0.0.3.2231,Culture = neutral,PublicKeyToken = null”或其依赖项之一。访问被拒绝。
Fusion日志:
Assembly manager loaded from: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll Running under executable c:\windows\system32\inetsrv\w3wp.exe --- A detailed error log follows. === Pre-bind state information === LOG: User = NT AUTHORITY\NETWORK SERVICE LOG: DisplayName = My.Namespace.AssemblyName, Version=0.0.3.2231, Culture=neutral, PublicKeyToken=null (Fully-specified) LOG: Appbase = file:///C:/Inetpub/wwwroot/Web Suite/Widgets LOG: Initial PrivatePath = NULL Calling assembly : (Unknown). === LOG: This bind starts in default load context. LOG: No application configuration file found. LOG: Using host configuration file: \\?\C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet.config LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config. LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). LOG: Attempting download of new URL file:///C:/Inetpub/wwwroot/Web Suite/Widgets/My.Namespace.AssemblyName.DLL. ERR: Failed to complete setup of assembly (hr = 0x80070005). Probing terminated.
我已经做过的事:
我已授予用户'NETWORK SERVICE'的'C:/ Inetpub / wwwroot / Web Suite / Widgets'文件夹读取和执行权限。
当我关闭阴影复制功能时,一切都很顺利
即使在Visual Studio 2008下的本地计算机上运行也没有任何问题
在Widgets文件夹中授予所有文件(而不是文件夹本身)的读取和执行权限并不能解决问题。
我认为它与ASP.NET临时文件文件夹的权限有关:
C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ web suite
此文件夹,其所有子文件夹及其中的文件都具有读取和读取功能。执行用户'NETWORK SERVICE'的权限。所以这也不是问题。
简短:
为什么我的网站(在IIS6下运行)无法访问新AppDomain的卷影复制文件?
答案 0 :(得分:0)
尝试使用-ga选项运行aspnet_regiis,如下所示:
aspnet_regiis -ga MachineName\AccountName
其中MachineName \ AccountName是应用程序池的标识。
答案 1 :(得分:0)
问题的原因是CachePath默认值。如果AppPool在网络服务下运行,则使用DefaultUser临时文件夹位置(我不知道为什么)。但网络服务无权访问该文件夹,这是异常的原因。解决方案是显式设置CachePath。例如,我们可以使用ASP.NET AppPool缓存路径:
var domainInfo = new AppDomainSetup
{
CachePath = AppDomain.CurrentDomain.SetupInformation.CachePath
/* ...*/
};