Ожидается ли работа 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.