2

我正在尝试在沙箱中运行一段代码。它失败了,问题来自使用缓存的代码部分。

它按预期工作的情况:

public void Demo()
{
    // Verify that the code is running in a sandbox: the next line is expected to
    // fail, since the sandbox doesn't have enough I/O privileges to access H:\.
    File.WriteAllText(@"H:\Hello.txt", "Hello");
}

按预期工作,即抛出异常,显示“请求权限 [...] FileIOPermission [...] 失败。”。

当我通过调用数据库替换代码时,再次出现预期结果:应用程序抱怨没有足够的权限。

如果我添加请求的权限,代码将毫无例外地执行。

失败的情况:

如果我将以前的方法替换为:

public void Demo()
{
    Cache cache = HttpRuntime.Cache;
    File.WriteAllText(@"H:\Hello.txt", "Hello");
}

它停止工作:不是预期的异常抱怨 I/O 权限不足,而是抛出的异常是System.Security.SecurityException

该程序集不允许部分受信任的调用者。

是否与此问题有关,或者缓存不打算在完全信任以外的场景中使用?

4

1 回答 1

0

以部分信任运行的代码内部使用缓存的一种可能方法是将缓存对象移到插件外部。适配器模式可用于使插件仍然能够从缓存中读取和写入数据,同时由调用者在完全信任的上下文中管理缓存。

如果其他人有兴趣,我在 CodePlex 上发布的项目中说明了原始问题和解决方案。

于 2012-06-25T15:42:05.153 回答