IsolatedStorageException: невозможно создать каталог магазина - PullRequest
4 голосов
/ 24 июня 2009

Привет! Мне нужно хранить скрытую информацию в изолированном пространстве. Для этого я использую класс 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

Ответы [ 5 ]

7 голосов
/ 13 сентября 2013

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

7 голосов
/ 02 октября 2009

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

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

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

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

  1. использовать GetMachineStoreForAssembly

  2. Если вы должны использовать 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 \

3 голосов
/ 24 июня 2009

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

использование (IsolatedStorageFile isoStore = IsolatedStorageFile.GetMachineStoreForAssembly ()) {}

И эта работа.

0 голосов
/ 24 июня 2009

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

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

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

Под каким аккаунтом работает сайт? Я предполагаю, что это не пользователь, который может войти на сервер и правильно взаимодействовать с файловой системой?

0 голосов
/ 24 июня 2009

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

...