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では正常に動作しますが、Windows2003である本番サーバーでは例外が表示されます

System.IO.IsolatedStorage.IsolatedStorageException:ストアディレクトリを作成できません。

asp.netプロジェクトフォルダーにEveryoneフルコントロールのアクセス許可があります。注意CSoft.Coreは、私が作成した個人用フレームワークです。

これは私のスタックトレースです:

[IsolatedStorageException:ストアディレクトリを作成できません。(HRESULTからの例外:0x80131468)]
System.IO.IsolatedStorage.IsolatedStorageFile.nGetRootDir(IsolatedStorageScopeスコープ)+0
System.IO.IsolatedStorage.IsolatedStorageFile.InitGlobalsNonRoamingUser(IsolatedStorageScopeスコープ)+97
System.IO.IsolatedStorage.IsolatedStorageFile.GetRootDir )+137
System.IO.IsolatedStorage.IsolatedStorageFile.GetGlobalFileIOPerm(IsolatedStorageScopeスコープ)+213
System.IO.IsolatedStorage.IsolatedStorageFile.Init(IsolatedStorageScopeスコープ)+56
System.IO.IsolatedStorage.IsolatedStorageFile.GetStore(IsolatedStorageScopeスコープ、タイプdomainEvidenceType、タイプassemblyEvidenceType)+59

C:\ Projectos \ FrameworkCS \ CSoft.Core \ IO \ StorageHelper.cs:18 CSoft.Web.UI.ViewStateHelper.SerializeViewState(HttpContext context、Object state )のCSoft.Core.IO.StorageHelper.Save(String fileName、String content))in c:\ Projectos \ FrameworkCS \ CSoft.Web.Controls \ Web \ UI \ ViewStateHelper.cs:65 CSoft.Web.UI.Page.SavePageStateToPersistenceMedium(Object state)in 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

4

5 に答える 5

7

このユーザーがすでに問題を解決していることは知っていますが、答えを探している他のユーザーにとっては. この投稿は完璧ではありませんが、この問題を解決するために必要なことを示しています。

asp.net では、GetMachineStoreForAssembly がほとんどの場合に機能するようであり、Web アプリから分離されたストレージを使用する場合は、おそらく望ましいモードです。GetUserStoreForAssembly を使用しても、asp.net アプリを実行しているユーザー アカウントによって分離され、各ログインを何らかの方法で Windows ユーザーにマッピングしない限り、各 Web サイト ユーザーに対して常に同じになるためです (そうである場合)。これを行うと、機能します)。

問題は、分離ストレージに対する権限を持つユーザーが必要なため、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

私はIsolatedStorageファイルをに変更しました

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

そしてこの作品。

于 2009-06-24T09:41:14.310 に答える
0

これをサーバーでどのように実行していますか?サーバー上でサービスとして実行している場合は、サービスの実行に割り当てられているユーザーに問題がある可能性があります。実稼働サーバーで使用しているのと同じユーザーでテストするようにしてください。

于 2009-06-24T00:33:07.563 に答える
0

John Saundersがコメントで尋ねているように、可能であれば、期待を投げかける行を含め、スタックトレースをさらに投稿してください。

ただし、いくつかの精神的なデバッグスキルを使用して、ここで役立つ可能性のあるいくつかの野生の刺し傷を取ります。

  1. IsolatedStorageExceptionは、 GetStoreIsolatedStorageFileStreamコンストラクターの両方でスローできます
  2. 「WindowsXPでは正常に動作します」-(おそらく管理者の)クレデンシャルで実行されているVisual StudioビルトインWebサーバーでサイトを実行する場合、プロファイルを持つユーザーとして、したがって分離ストレージフォルダーとして実行する場合。
  3. 「しかし、本番環境では例外がスローされます」-「ネットワークサービス」またはプロファイルを持たない他のアカウントで実行されている場合、またはデスクトップタイプの権限と対話する場合(詳細は不明です-主にキラーであるプロファイル)。

サイトはどのようなアカウントで運用されていますか?サーバーにログオンしてファイルシステムと適切に対話できるのはユーザーではないと思いますか?

于 2009-06-24T00:34:58.290 に答える