Ожидается ли работа System.Web.Caching.Cache в песочнице?

Я пытаюсь запустить кусок кода в песочнице. Это не удалось, и проблема связана с той частью кода, где используется кэш.

Случай, когда он работает как положено:

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");
}

он перестает работать: вместо ожидаемого исключения, которое жалуется на недостаточные разрешения ввода / вывода, выбрасывается System.Security.SecurityException:

Эта сборка не допускает частично доверенных абонентов.

Есть ли какое-то отношение к этой проблеме, или кеш не предназначен для использования в сценариях, отличных от полного доверия?

1 ответ

Решение

Один из возможных способов использования кэша внутри кода, работающего с частичным доверием, - переместить объект кэша за пределы плагина. Шаблон адаптера может использоваться для того, чтобы плагин все еще мог читать и записывать данные из и в кеш, одновременно управляя кешем вызывающей стороной в контексте полного доверия.

Если другие люди заинтересованы, я проиллюстрировал оригинальную проблему и решение в проекте, опубликованном на CodePlex.

Другие вопросы по тегам