IsolatedStorageException: невозможно создать каталог магазина

StackOverflow https://stackoverflow.com/questions/1035576

Вопрос

Привет! Мне нужно хранить скрытую информацию в изолированном пространстве. Для этого я использую класс System.IO.Isolated вроде

IsolatedStorageFile isf =     System.IO.IsolatedStorage.IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);
Stream writer = new IsolatedStorageFileStream(filename, FileMode.Create, isf);

IFormatter formatter = new BinaryFormatter();
formatter.Serialize(writer, appCollection.ToString());

writer.Close();

Он отлично работает в Windows XP, но на рабочем сервере под управлением Windows 2003 он показывает исключение

System.IO.IsolatedStorage.IsolatedStorageException: невозможно создать каталог хранилища.

У меня есть все права доступа «Все» в папке проекта asp.net. Внимание CSoft.Core - это созданный мной персональный фреймворк.

Это моя трассировка стека:

  

[IsolatedStorageException: невозможно создать каталог хранилища.   (Исключение из HRESULT: 0x80131468)]
  System.IO.IsolatedStorage.IsolatedStorageFile.nGetRootDir (IsolatedStorageScope   сфера) +0
  System.IO.IsolatedStorage.IsolatedStorageFile.InitGlobalsNonRoamingUser (IsolatedStorageScope   сфера) +97
  System.IO.IsolatedStorage.IsolatedStorageFile.GetRootDir (IsolatedStorageScope   сфера) +137
  System.IO.IsolatedStorage.IsolatedStorageFile.GetGlobalFileIOPerm (IsolatedStorageScope   сфера) +213
  System.IO.IsolatedStorage.IsolatedStorageFile.Init (IsolatedStorageScope   сфера) +56
  System.IO.IsolatedStorage.IsolatedStorageFile.GetStore (IsolatedStorageScope   область действия, тип domainEvidenceType, тип assemblyEvidenceType) +59
  CSoft.Core.IO.StorageHelper.Save (строковое имя файла, строковое содержимое) в   C: \ Projectos \ FrameworkCS \ CSoft.Core \ IO \ StorageHelper.cs: 18
  CSoft.Web.UI.ViewStateHelper.SerializeViewState (HttpContext context,   Состояние объекта) в   C: \ Projectos \ FrameworkCS \ CSoft.Web.Controls \ Web \ UI \ ViewStateHelper.cs: 65   CSoft.Web.UI.Page.SavePageStateToPersistenceMedium (состояние объекта) в   C: \ Projectos \ FrameworkCS \ CSoft.Web.Controls \ Web \ UI \ Page.cs: 302
  System.Web.UI.Page.SaveAllState () +236
  System.Web.UI.Page.ProcessRequestMain (Boolean   includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)   +1099

Это было полезно?

Решение 3

Я изменил файл IsolatedStorage на

using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetMachineStoreForAssembly ())             {}

И эта работа.

Другие советы

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

С asp.net GetMachineStoreForAssembly, кажется, работает в большинстве случаев, и это, вероятно, желаемый режим при использовании изолированного хранилища из веб-приложения. Потому что даже если вы используете GetUserStoreForAssembly, он будет изолирован учетной записью пользователя, работающей с приложением asp.net, и всегда будет одинаковым для каждого пользователя веб-сайта, если только вы каким-то образом не сопоставляете каждое имя входа с пользователем Windows (о, и если вы делая это, то это будет работать).

Проблема в том, что вы пытаетесь использовать GetUserStoreForAssembly, потому что для этого нужен пользователь с правами на изолированное хранилище, по умолчанию пользователь IIS для приложений не получает прав на это, я думаю.

Есть 2 решения:

<Ол>
  • используйте GetMachineStoreForAssembly

  • Если вы должны использовать GetUserStoreForAssembly, установите приложение для запуска от имени пользователя с правами. Это не решается правами доступа к папкам. Существует несколько способов настройки безопасности. (IIS7) Вы можете установить его в пуле приложений или в разделе основных настроек > Подключиться как или в разделе «Аутентификация» > Анонимная аутентификация. Я не уверен, какие именно права нужны пользователю, но это поможет вам двигаться в правильном направлении.

  • Вот некоторый бонусный код, который может помочь вам выяснить вашу проблему:

       Dim storageFile As IsolatedStorageFile
        If Request("storage") = "user" Then
            storageFile = IsolatedStorageFile.GetUserStoreForAssembly()
        Else
            storageFile = IsolatedStorageFile.GetMachineStoreForAssembly()
        End If
    
        Response.Write(storageFile.GetType.GetField("m_RootDir", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance).GetValue(storageFile).ToString())
    

    GetUserStoreForAssembly находится здесь: C: \ Documents and Settings \ Gabe \ Локальные настройки \ Данные приложения \ IsolatedStorage \

    GetMachineStoreForAssembly находится здесь: C: \ Documents and Settings \ Все пользователи \ Данные приложения \ IsolatedStorage \

    Если он работает в IIS, а идентификация пула приложений - NetworkService, попробуйте перейти к дополнительным настройкам пула приложений и установить " Загрузить профиль пользователя " значение для "True". Работал на меня.

    Как у вас это работает на сервере? Если вы используете его в качестве службы на сервере, у вас могут быть проблемы с пользователем, назначенным для запуска службы. Убедитесь, что вы тестируете с тем же пользователем, которого используете на рабочем сервере.

    Как просит Джон Сондерс в своем комментарии, пожалуйста, опубликуйте больше трассировки стека, включая, если возможно, строки, бросающие исключение.

    Однако, используя некоторые навыки отладки психики Я возьму пару диких ударов, которые могут помочь:

    <Ол>
  • IsolatedStorageException может быть вызвано как GetStore , так и IsolatedStorageFileStream конструктор
  • " отлично работает в Windows XP " - когда вы запускаете сайт в Visual Studio, встроенном в веб-сервер, работающий под вашими (вероятно, администраторскими) учетными данными, но определенно как пользователь с профилем и, следовательно, с папкой изолированного хранилища.
  • " Но на производстве выдается исключение " - когда он работает под либо «Сетевой сервис» или какая-либо другая учетная запись, у которой нет профиля, или права взаимодействия с типом рабочего стола (не уверен в специфике - это в основном отсутствие профиля, который является убийцей).
  • Под каким аккаунтом работает сайт? Я предполагаю, что это не пользователь, который может войти на сервер и правильно взаимодействовать с файловой системой?

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top