我有一个使用模拟的ASP.NET Web应用程序,其中包含以下web.config条目:
<system.web>
<identity impersonate="true" />
<authentication mode="Windows" />
<authorization>
<allow roles="Administrators" />
<deny users="*" />
</authorization>
</system.web>
独立地,这很好用。用户必须以管理员身份登录,当他们这样做时,应用程序可以代表他们执行管理操作。
除此之外,我想在一个单独的AppDomain中隔离一些操作,理想情况下也喜欢影子复制文件。我设置了这样的AppDomain:
AppDomainSetup appSetup = new AppDomainSetup();
appSetup.ShadowCopyFiles = "true";
appSetup.ApplicationBase =
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
hostAppDomain = AppDomain.CreateDomain(
"AppDomain1",
AppDomain.CurrentDomain.Evidence,
appSetup);
然后我尝试在此AppDomain中创建一个对象实例,如:
var crossObject = (CrossAppDomainObject)hostAppDomain.CreateInstanceAndUnwrap(
typeof(CrossAppDomainObject).Assembly.FullName,
typeof(CrossAppDomainObject).FullName);
这会产生错误:
指定的用户没有有效的个人资料。无法加载'MyAssembly,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'。
如果我不将AppDomain设置为使用ShadowCopy,问题就会消失。任何人都可以解释这种行为吗?
更具体一点,我实际上不需要复制所有程序集。最终我的CrossAppDomainObject
将使用MEF从另一个文件夹加载程序集,而这些是我想要复制阴影的其他程序集。我怀疑通过将阴影副本配置为在其复制的文件中具有选择性,我可以得到我想要的东西。 但是,我仍然想知道导致此错误的原因。
答案 0 :(得分:2)
而不是将阴影复制到哪些程序集,而是问题是由于将程序集复制到&#39;的问题引起的。
即,未指定AppDomainSetup.CachePath会导致运行时在进行卷影复制时尝试使用&#34;用户的下载缓存&#34;位于用户个人资料目录中的位置(在C:\Users\
内)。
您的错误是因为管理员是一个没有此类个人资料目录的特殊帐户。
一种解决方案是简单地使用运行Web应用程序的AppDomain文件夹,因为ASP.NET已经使用了特定的CachePath(类似于C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\d32f4325
),因此它适用于这样的&#39;虚拟&# 39;用户帐户。如果这样的路径适合你,那就做吧
appSetup.CachePath = AppDomain.CurrentDomain.SetupInformation.CachePath;