4

嗨,我必须在隔离空间中存储一些隐藏信息。为此,我正在使用 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, Type装配证据类型)+59
CSoft.Core.IO.StorageHelper.Save(String fileName, String content) in c:\Projectos\FrameworkCS\CSoft.Core\IO\StorageHelper.cs:18
CSoft.Web.UI.ViewStateHelper.SerializeViewState(HttpContext context, Object state ) 在 c:\Projectos\FrameworkCS\CSoft.Web.Controls\Web\UI\ViewStateHelper.cs:65 CSoft.Web.UI.Page.SavePageStateToPersistenceMedium(Object state) 在 c:\Projectos\FrameworkCS\CSoft.Web.Controls \Web\UI\Page.cs:302
System.Web.UI.Page.SaveAllState() +236
System.Web.UI.Page.ProcessRequestMain(布尔型 includeStagesBeforeAsyncPoint,布尔型 includeStagesAfterAsyncPoint)+1099

4

5 回答 5

9

如果它在 IIS 上运行并且应用程序池标识为 NetworkService,您可以尝试转到应用程序池的高级设置并将“加载用户配置文件”值设置为“True”。为我工作。

于 2013-09-13T07:29:45.270 回答
7

我知道这个用户已经解决了他们的问题,但其他人正在寻找答案。这篇文章并不完美,但它会为您指出解决此问题所需的内容。

使用 asp.net GetMachineStoreForAssembly 似乎在大多数情况下都可以工作,并且在使用来自 Web 应用程序的隔离存储时,它可能是所需的模式。因为即使您使用 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\Local Settings\Application Data\IsolatedStorage\

GetMachineStoreForAssembly 在这里:C:\Documents and Settings\All Users\Application Data\IsolatedStorage\

于 2009-10-02T16:01:53.477 回答
4

我将独立存储文件更改为

使用 (IsolatedStorageFile isoStore = IsolatedStorageFile.GetMachineStoreForAssembly()) { }

而这项工作。

于 2009-06-24T09:41:14.310 回答
0

你是如何在服务器上运行它的?如果您在服务器上将其作为服务运行,则分配给运行该服务的用户可能存在问题。确保使用您在生产服务器上使用的同一用户进行测试。

于 2009-06-24T00:33:07.563 回答
0

正如约翰桑德斯在他的评论中所问的那样,请发布更多的堆栈跟踪,如果可能的话,包括抛出异常的行。

但是,使用一些心理调试技巧,我将在这里采取一些可能会有所帮助的狂野刺伤:

  1. 隔离存储异常可以由GetStore隔离存储文件流构造函数抛出
  2. “它在 Windows XP 中运行良好” - 当您在 Visual Studio 内置 Web 服务器中运行该站点时,该服务器在您的(可能是管理员)凭据下运行,但肯定是作为具有配置文件的用户,因此是独立存储文件夹。
  3. “但在生产中它会引发异常” - 当它在“网络服务”或其他没有配置文件的帐户下运行时,或与桌面类型权限交互时(不确定具体细节 - 主要是缺乏个人资料,这是一个杀手)。

该网站在生产中运行的帐户是什么类型的?我假设不是能够登录到服务器并与文件系统正确交互的用户?

于 2009-06-24T00:34:58.290 回答