IsolatedStorageException: невозможно создать каталог магазина
-
10-07-2019 - |
Вопрос
Привет! Мне нужно хранить скрытую информацию в изолированном пространстве. Для этого я использую класс 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". Работал на меня.
Как у вас это работает на сервере? Если вы используете его в качестве службы на сервере, у вас могут быть проблемы с пользователем, назначенным для запуска службы. Убедитесь, что вы тестируете с тем же пользователем, которого используете на рабочем сервере.
Как просит Джон Сондерс в своем комментарии, пожалуйста, опубликуйте больше трассировки стека, включая, если возможно, строки, бросающие исключение.
Однако, используя некоторые навыки отладки психики Я возьму пару диких ударов, которые могут помочь:
<Ол>Под каким аккаунтом работает сайт? Я предполагаю, что это не пользователь, который может войти на сервер и правильно взаимодействовать с файловой системой?