Problema com profile
Minha aplicação rodava perfeitamente mas quando mudei para o windows server 2008 e iis 8 comecaram alguns problemas. Um deles é quanto ao profile, na minha aplicação agora está dando erro de objeto indefinido. Que comando eu poderia usar para criar o profile de um usuário por conta do meu código. Antes ele criava o objeto automaticamente. Grato desde já.
Ademilso Peres
Curtidas 0
Respostas
Luiz Maia
12/03/2010
Ademilso,
Atualmente nas aplicações ASP.NET utilizamos Cookies e variáveis de sessão (Session) para armazenar informações específicas de um determinado usuário.
O Profile é bem semelhante ao objeto Session atual, onde para cada usuário que temos em nossa aplicação Web é criado um Profile para ele. Até então funciona da mesma forma que o objeto Session. Mas o mais interessante está por vir, ou seja, quando fechamos o browser, a Session é perdida. Já utilizando o Profile ele se mantém persistente mesmo depois do usuário fechar o browser. Pode ser isto que o IIS 8 esta dando problemas.
Isso se deve graças ao uso, por default, do Microsoft Access, onde são armazenadas estas informações, que fica dentro de uma pasta chamada Data, dentro da sua aplicação. Vale lembrar que é perfeitamente possível o uso de uma outra Base de Dados para termos uma melhor performance, como por exemplo SQL Server ou Oracle.
Além da vantagem de se manter persistente mesmo depois de fechado o Browser, o Profile ainda tem uma vantagem, que particularmente considero fantástica, que é fortemente tipado (strongly typed), ao contrário da Session, que por sua vez aceitava um Object. Além disso, o IntelliSense já reconhece as propriedades, tornando assim o desenvolvimento mais rápido e menos propício a erros.
Definindo o Profile
Você deve utilizar o arquivo Web.Config para gerar a estrutura que o teu objeto Profile irá ter. Temos à nossa disposição o elemento profile, onde definimos as propriedades que vamos disponibilizar. O cenário é termos dentro do Profile, o Nome e Email do Usuário. Abaixo o código do arquivo Web.Config que define o Profile:
1 2 3 4 5 6 7 8 9 10 11 12 13 <configuration> <system.web> <authentication mode="Forms" /> <anonymousIdentification enabled="true" /> <profile> <properties> <add name="Nome" defaultValue="" allowAnonymous="true" /> <add name="Email" defaultValue="" allowAnonymous="true" /> </properties> </profile> </system.web> </configuration> Código 1 - Definindo a estrutura do Profile no arquivo Web.Config.
Analisando o código acima, vemos o elemento anonymousIdentification que especificará que o Profile será criado para usuários anônimos ou autenticados. Se definí-lo com False e tentar atribuir algum valor as propriedades em runtime e o usuário não estiver autenticado, uma Exception será lançada. Já o atributo allowAnonymous é requerido quando as propriedades são usadas com usuários anônimos.
O código para atribuir um valor as propriedades, fica da seguinte forma:
1 2 Profile.Email = "israel@projetando.net" Profile.Nome = "Israel Aéce" Código 2 - Acessando as propriedades do Profile.
O Intellisense já passa a interpretar as propriedades que definimos no Web.Config.
Repare que o tipo do dado não é definido. Isso porque o default, quando não informamos é System.String. Caso queria definir um tipo Inteiro ou qualquer outro tipo, tem o atributo type, onde define-se o tipo de dado que queira para aquela propriedade.
Profile Groups
Quando começamos a criar várias propriedades dentro do arquivo Web.Config para utilizarmos no Profile, começamos a ter a necessidade de separar algumas delas em grupos para que facilite a compreensão e organização. Para isso temos o elemento group, onde dentro dele colocamos as propriedades pertinentes ao mesmo. Se quisermos adicionar um grupo chamando Endereco, contendo Rua, Cidade, Estado, fazemos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <configuration> <system.web> <authentication mode="Forms" /> <anonymousIdentification enabled="true" /> <profile> <properties> <add name="Nome" defaultValue="" allowAnonymous="true" /> <add name="Email" defaultValue="" allowAnonymous="true" /> <group name="Endereco" /> <add name="Rua" defaultValue="" allowAnonymous="true" /> <add name="Cidade" defaultValue="" allowAnonymous="true" /> </group> </properties> </profile> </system.web> </configuration> Código 3 - Definindo grupos do Profile no arquivo Web.Config.
E para acessá-los, o código fica:
1 2 3 4 Profile.Email = "israel@projetando.net" Profile.Nome = "Israel Aéce" Profile.Endereco.Rua = "Magnólias, das" Profile.Endereco.Cidade = "Valinhos" Código 4 - Acessando as propriedades com grupos do Profile.
O Profile é bem semelhante ao objeto Session atual, onde para cada usuário que temos em nossa aplicação Web é criado um Profile para ele. Até então funciona da mesma forma que o objeto Session. Mas o mais interessante está por vir, ou seja, quando fechamos o browser, a Session é perdida. Já utilizando o Profile ele se mantém persistente mesmo depois do usuário fechar o browser. Pode ser isto que o IIS 8 esta dando problemas.
Isso se deve graças ao uso, por default, do Microsoft Access, onde são armazenadas estas informações, que fica dentro de uma pasta chamada Data, dentro da sua aplicação. Vale lembrar que é perfeitamente possível o uso de uma outra Base de Dados para termos uma melhor performance, como por exemplo SQL Server ou Oracle.
Além da vantagem de se manter persistente mesmo depois de fechado o Browser, o Profile ainda tem uma vantagem, que particularmente considero fantástica, que é fortemente tipado (strongly typed), ao contrário da Session, que por sua vez aceitava um Object. Além disso, o IntelliSense já reconhece as propriedades, tornando assim o desenvolvimento mais rápido e menos propício a erros.
Definindo o Profile
Você deve utilizar o arquivo Web.Config para gerar a estrutura que o teu objeto Profile irá ter. Temos à nossa disposição o elemento profile, onde definimos as propriedades que vamos disponibilizar. O cenário é termos dentro do Profile, o Nome e Email do Usuário. Abaixo o código do arquivo Web.Config que define o Profile:
1 2 3 4 5 6 7 8 9 10 11 12 13 <configuration> <system.web> <authentication mode="Forms" /> <anonymousIdentification enabled="true" /> <profile> <properties> <add name="Nome" defaultValue="" allowAnonymous="true" /> <add name="Email" defaultValue="" allowAnonymous="true" /> </properties> </profile> </system.web> </configuration> Código 1 - Definindo a estrutura do Profile no arquivo Web.Config.
Analisando o código acima, vemos o elemento anonymousIdentification que especificará que o Profile será criado para usuários anônimos ou autenticados. Se definí-lo com False e tentar atribuir algum valor as propriedades em runtime e o usuário não estiver autenticado, uma Exception será lançada. Já o atributo allowAnonymous é requerido quando as propriedades são usadas com usuários anônimos.
O código para atribuir um valor as propriedades, fica da seguinte forma:
1 2 Profile.Email = "israel@projetando.net" Profile.Nome = "Israel Aéce" Código 2 - Acessando as propriedades do Profile.
O Intellisense já passa a interpretar as propriedades que definimos no Web.Config.
Repare que o tipo do dado não é definido. Isso porque o default, quando não informamos é System.String. Caso queria definir um tipo Inteiro ou qualquer outro tipo, tem o atributo type, onde define-se o tipo de dado que queira para aquela propriedade.
Profile Groups
Quando começamos a criar várias propriedades dentro do arquivo Web.Config para utilizarmos no Profile, começamos a ter a necessidade de separar algumas delas em grupos para que facilite a compreensão e organização. Para isso temos o elemento group, onde dentro dele colocamos as propriedades pertinentes ao mesmo. Se quisermos adicionar um grupo chamando Endereco, contendo Rua, Cidade, Estado, fazemos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <configuration> <system.web> <authentication mode="Forms" /> <anonymousIdentification enabled="true" /> <profile> <properties> <add name="Nome" defaultValue="" allowAnonymous="true" /> <add name="Email" defaultValue="" allowAnonymous="true" /> <group name="Endereco" /> <add name="Rua" defaultValue="" allowAnonymous="true" /> <add name="Cidade" defaultValue="" allowAnonymous="true" /> </group> </properties> </profile> </system.web> </configuration> Código 3 - Definindo grupos do Profile no arquivo Web.Config.
E para acessá-los, o código fica:
1 2 3 4 Profile.Email = "israel@projetando.net" Profile.Nome = "Israel Aéce" Profile.Endereco.Rua = "Magnólias, das" Profile.Endereco.Cidade = "Valinhos" Código 4 - Acessando as propriedades com grupos do Profile.
GOSTEI 0
Ademilso Peres
12/03/2010
Tudo isso que voce escreveu eu já sabia, eu estou com um problema muito especifico, por isso postei está duvida, a minha aplicação não está criando o objeto profile por algum motivo que gostaria de saber. Segue o codigo
void Page_Load(object sender, EventArgs e)
{
try
{
if (!Page.IsPostBack)
{
if (Session["Rodou"] == null)
{
if (!this.Profile.IsAnonymous) // Nessa linha esta ocorrendo NullReferenceException mas no windowns 2003 funcionar perfeitamente.
Voce poderia me ajudar?
GOSTEI 0
Luiz Maia
12/03/2010
Ademilso,
Infelizmente não tenho meios para testar seu codigo, ja que não temos o WS 2008 e nem o IIS 8 instalados em nossas máquinas, portanto, tive que fazer uma consulta para ver se achava algo relacionado ao seu problema.
Acredito que você também ja o tenha feito.
O que encontrei foi que realmente há uma imcompatibilidade quanto as versões dos Profiles para Versão 1 (Windows 2000, Windows XP, Windows Server 2003) e Versao 2 (Windows Vista, Windows Server 2008).
Pelo que entendi, este problema esta diretamente ligado ao Sistema Operacional, e não tem haver com codificação, portanto, foge do nosso escopo do serviço de Suporte.
Mas, ja que estou procurando, e achei algo que talvez te interesse, você tem acesso ao servidor 2008?
Aguardo
Att
Luiz Maia
GOSTEI 0
Ademilso Peres
12/03/2010
Sim, tenho acesso a maquina que roda o windows server 2008.
GOSTEI 0
Luiz Maia
12/03/2010
Veja este artigo (em ingles) que talvez esclareça algo, mas como te disse, não esta no escopo de desenvolvimento e não temos o ws 2008 nem o IIS 2008 instalado, o que nos impossibilita de tentar resolver o problema através de uma simulação, ok?
Vou cancelar o chamado, assim você não perde estes creditos!!
For the general roaming profile, here is a step-to-step practice:
1. Prepare the roaming user profile
- Log on to a Windows Server 2008 with the domain user account to produce a user profile. Log off the computer.
- Log on to the Windows Server 2008 with a domain administrator account.
- Click Start--->right-click Computer--->Properties--->Advanced System Settings--->Advanced--->User Profiles Settings…--->Settings--->Copy To. Copy the profile to the file server, such as '\\filesrv\profiles\username.v2'
Note: A ".v2" suffix to the name of the user profile folder on the file server must be added to distinguish between version 1 and version 2 profiles.
- In Permitted to use, click Change. Type the proper users or groups and then click OK.
2. Prepare the user Profile path setting
- In the Active Directory Users and Computers, type the profile location such as '\\filesrv\profiles\username' in the user's Profile path attributes.
Note: Do NOT add ".v2" to the Profile path of the user object. This indicates that for Windows Server 2008 it will load the profile from 'username.v2' folder and for former Windows operating systems they will load from 'username' folder if it exists.
If you manually create user profile folder, please check the NTFS and share permission on the roaming profile share folder.
- Locate the roaming profile share folder, and check the NTFS permission to make sure that the user, SYSTEM, and administrators have Full Controller permission on their folders and all sub-folder under the roaming profile folder has inherited proper permission.
- Check the share permission to ensure that Everyone has Full Control permission.
Please pay attention to the Event logs in Windows Logs--->Application. User Profile Service will log events to show the reason why the roaming profile is not applied. http://www.pcfixreview.com Abraços Att Luiz Maia
Please pay attention to the Event logs in Windows Logs--->Application. User Profile Service will log events to show the reason why the roaming profile is not applied. http://www.pcfixreview.com Abraços Att Luiz Maia
GOSTEI 0
Ademilso Peres
12/03/2010
gostaria da opinião de outro consultor.
GOSTEI 0