Pergunta

Oi eu tenho para armazenar algumas informações escondidas no espaço isolado. Por que eu estou usando a classe System.IO.Isolated como

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();

Ele funciona muito bem no Windows XP, mas na produção de servidor que é o windows 2003 mostra exceção

System.IO.IsolatedStorage.IsolatedStorageException:. Não é possível criar o diretório de armazenamento

Eu tenho todos permissões de controle total na minha pasta de projeto asp.net. Atenção CSoft.Core é um quadro pessoal criado por mim.

Este é o meu Stack Trace:

[IsolatedStorageException: Não é possível criar o diretório de armazenamento. (Exceção de HRESULT: 0x80131468)]
System.IO.IsolatedStorage.IsolatedStorageFile.nGetRootDir (IsolatedStorageScope escopo) +0
System.IO.IsolatedStorage.IsolatedStorageFile.InitGlobalsNonRoamingUser (IsolatedStorageScope escopo) +97
System.IO.IsolatedStorage.IsolatedStorageFile.GetRootDir (IsolatedStorageScope escopo) 137
System.IO.IsolatedStorage.IsolatedStorageFile.GetGlobalFileIOPerm (IsolatedStorageScope escopo) +213
System.IO.IsolatedStorage.IsolatedStorageFile.Init (IsolatedStorageScope escopo) +56
System.IO.IsolatedStorage.IsolatedStorageFile.GetStore (IsolatedStorageScope escopo, Tipo domainEvidenceType, Tipo assemblyEvidenceType) +59
CSoft.Core.IO.StorageHelper.Save (String fileName, conteúdo String) em c: \ Projectos \ FrameworkCS \ CSoft.Core \ IO \ StorageHelper.cs: 18
CSoft.Web.UI.ViewStateHelper.SerializeViewState (HttpContext contexto, estado do objeto) em c: \ Projectos \ FrameworkCS \ CSoft.Web.Controls \ Web \ UI \ ViewStateHelper.cs: 65 CSoft.Web.UI.Page.SavePageStateToPersistenceMedium (estado do objeto) em c: \ Projectos \ FrameworkCS \ CSoft.Web.Controls \ Web \ UI \ Page.cs: 302
System.Web.UI.Page.SaveAllState () +236
System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, booleano includeStagesAfterAsyncPoint) 1099

Foi útil?

Solução 3

Eu mudei arquivo IsolatedStorage para

usando (IsolatedStorageFile isoStore = IsolatedStorageFile.GetMachineStoreForAssembly ()) {}

E este trabalho.

Outras dicas

Eu sei que este usuário resolvido o seu problema já, mas para outros à procura de uma resposta. Este post não é perfeito, mas ele vai apontar-lhe o que você precisa para resolver este problema.

Com asp.net GetMachineStoreForAssembly parece funcionar na maioria dos casos, e provavelmente o modo desejado ao usar o armazenamento isolado de um aplicativo web. Porque mesmo se você usar GetUserStoreForAssembly, ele será isolado por conta de usuário que está executando o aplicativo asp.net e será sempre o mesmo para cada usuário do site, a menos que de alguma forma estão mapeando cada login para um usuário do Windows (oh e se você estiver fazendo isso, então seria trabalho).

O problema é, em seguida, tentar usar GetUserStoreForAssembly porque ele precisa de um usuário com direitos para o armazenamento isolado, o padrão IIS usuário para aplicações não recebem direitos para este eu acho.

Existem 2 soluções:

  1. uso GetMachineStoreForAssembly

  2. Se você deve usar GetUserStoreForAssembly definir o App para executar como usuário com direitos. Isto não é resolvido por permissões de pasta. Existem várias maneiras de obter a configuração de segurança. (IIS 7) Você pode configurá-lo no pool de App, ou sob as configurações básicas> Conectar-se como, ou sob authenication> Anonymous authenication. Não estou certo exatamente o que direitos as necessidades do usuário, mas isso vai te indo na direção certa.

Aqui está um código de bónus que pode ajudá-lo a descobrir o seu problema:

   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 está aqui: C: Settings \ Documents and Settings \ Gabe \ Local \ Application Data \ IsolatedStorage \

GetMachineStoreForAssembly está aqui: C: \ Documents and Settings \ All Users \ Application Data \ IsolatedStorage \

Se ele está em execução no IIS ea identidade do pool de aplicativos é NetworkService, você pode tentar ir para configurações avançadas do pool de aplicativos e valor definido "Load perfil de usuário" para "True". Trabalhou para mim.

Como você está executando isso no servidor? Se você estiver executando-o como um serviço no servidor, você pode ter um problema com o usuário atribuído para executar o serviço. Certifique-se de testar com o mesmo usuário que você está usando no servidor de produção.

Como John Saunders pede em seu comentário, por favor postar mais do rastreamento de pilha, incluindo, se possível, as linhas jogando o expception.

No entanto, usando algumas habilidades psíquicas de depuração , eu vou tomar um par de golpes selvagens aqui que podem ajudar:

  1. IsolatedStorageException pode ser jogado por ambos GetStore e IsolatedStorageFileStream construtor
  2. "Ele funciona muito bem no Windows XP" - quando você executar o site no Visual Studio construído em servidor web rodando sob as suas credenciais (provavelmente admin), mas certamente como um usuário com um perfil, e, portanto, uma pasta de armazenamento isolado.
  3. "Mas sobre a produção de ele lança uma exceção" - quando ele está correndo por baixo de "Serviço de rede" ou alguma outra conta que não tem um perfil, ou interagem com o tipo de direitos pessoais de mesa (não tenho certeza dos detalhes - é, principalmente, a a falta de um perfil que é um assassino).

Que tipo de conta é o site que funciona sob a prodution? Presumo que não é um usuário que é capaz de fazer logon no servidor e interagir com o sistema de arquivos corretamente?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top