2

デフォルトのWebサイトのIISにさまざまなWebアプリ(WCFサービスを含む)があります。それらがすべて同じアプリプールで実行されている限り、共有の分離されたストレージファイルに問題なくアクセスできます。

ただし、それらを別のアプリプールに移動すると、別のファイルにアクセスしようとすると、「System.IO.IsolatedStorage.IsolatedStorageException:ミューテックスを作成できません」というメッセージが表示されます。それらはすべてNetworkServiceユーザーの下で実行されています。GetUserStoreForAssemblyとGetMachineStoreForAssemblyをすべて試しましたが、すべて同じ結果になりました。共有ファイルを使用できなかった理由はありますか?

ストリームを閉じて、保持している場合に備えて破棄するようにしましたが、あるサービスがストリームを書き込み、別のサービスが後でそれを読み取ろうとすると、常に失敗するという簡単なテストを実行しています。

また、署名されたアセンブリから隔離されたストアにアクセスしています。

誰かアイデアはありますか?

コードは次のとおりです。

Private Sub LoadData()
    Dim filename = FullFilePath(_fileName)

    Dim isoStorage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForAssembly()
    ' Tried GetMachineStoreForAssembly, same failure
    isoStorage.CreateDirectory(ROOT_DIRECTORY)

    If (isoStorage.GetFileNames(filename).Length = 0) Then
        Return
    End If

    Dim stream As Stream = New IsolatedStorageFileStream(filename, FileMode.OpenOrCreate, isoStorage)
    If stream IsNot Nothing Then
        Try

            Dim formatter As IFormatter = New BinaryFormatter()
            Dim appData As Hashtable = DirectCast(formatter.Deserialize(stream), Hashtable)

            Dim enumerator As IDictionaryEnumerator = appData.GetEnumerator()
            While enumerator.MoveNext()
                Me(enumerator.Key) = enumerator.Value
            End While
        Finally
            stream.Close()
            stream.Dispose()
            stream = Nothing
        End Try
    End If

End Sub

Public Sub Save()
    Dim filename = FullFilePath(_fileName)

    ' Open the stream from the IsolatedStorage.
    Dim isoFile As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForAssembly()
    ' Tried GetMachineStoreForAssembly, same failure
    Dim stream As Stream = New IsolatedStorageFileStream(filename, FileMode.Create, isoFile)
    If stream IsNot Nothing Then
        Try
            Dim formatter As IFormatter = New BinaryFormatter()
            formatter.Serialize(stream, DirectCast(Me, Hashtable))
        Finally
            stream.Close()
            stream.Dispose()
            stream = Nothing
        End Try
    End If

End Sub
4

1 に答える 1

2

信頼の問題だったようです。

分離されたストレージファイルにアクセスするアセンブリをgacに追加した後、gac内のすべてのものに完全な信頼が自動的に設定されるため、魔法のように機能しました。

これは私にとってはうまくいきますが、他のソリューションでこれを行うためのオプションであるとは限りません。その場合は、.NETFrameworkcaspolユーティリティを確認してください。

これが誰かに役立つことを願っています!それは私にとって大きなピタでした。

于 2013-04-01T12:51:47.567 に答える