Obtendo “SQLExpress arquivo de banco de dados de erro de criação de auto” para site que usa AspNetSqlMembershipProvider, mas seqüência de conexão é para o SQL Server 2005

StackOverflow https://stackoverflow.com/questions/1402430

Pergunta

Eu tenho um site ASP.NET v2.0 (não aplicação web) onde o diretório raiz é público, mas o subdiretório "Admin" requer autenticação. Tudo sobre a configuração é muito genérico - eu usei uma seqüência de conexão definida no web.config de raiz, eo provedor AspNetSqlMembershipProvider padrão, e eu estou usando o controle ASP.NET Entrada
. O web.config nos especifica diretório admin que o usuário deve ter a função "Admin".

Eu estou usando SQL Server 2008, e minha cadeia de conexão é bom; cada página nível de raiz é de dados conduzido e todos eles trabalham muito bem.
configuração do provedor parece goo.

quando eu login, do controle Login "OnLoggedIn" fogos de eventos.
A última linha em que código do evento redireciona-me para minha página Admin/Default.aspx. Meu ponto de interrupção na mostra "OnLoggedIn" me que tudo está bem até que o redirecionamento para baixo em meu diretório de administração ... e então ...

... e então eu esperar ... e esperar ...

E então eu recebo um erro me dizendo que é experimentado uma "SQLExpress database file auto-creation error."

Por que o mundo é, de repente, tentando criar um arquivo SQL Server Express? Por que, de repente, ignorando a minha seqüência de conexão?

Uma pista estranha: Pouco antes da última linha do evento "OnLoggedIn" Eu coloquei no seguinte:

bool blnTest = User.IsInRole("Admin");

Eu queria ver se blnTest = true.
O que acontece é o processo atinge esta linha ... e espera ... e, eventualmente, me diz que ele não pode acessar o banco de dados SQL Server Express. Parece que qualquer referência (ou no meu código, ou nos bastidores) para determinar o papel do usuário, chama o banco de dados errado.

EDIT: Argh, às vezes ele espera quando eu testar blnTest. Outras vezes, imediatamente informa o valor como "falso".

Foi útil?

Solução

De acordo com o seu comentário, parece que você não configurou explicitamente um provedor de função para você site.

Se tudo o que está em seu web.config é:

<roleManager enabled="true" />

Em seguida, você está contando com os provedores padrão declarado mais acima na hieracrchy configuração (machine.config, web.config global, etc)

Em Machine.config você provavelmente tem algo como:

<roleManager>
  <providers>
    <add name="AspNetSqlRoleProvider" 
      connectionStringName="LocalSqlServer" 
      applicationName="/" 
      type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
    <add name="AspNetWindowsTokenRoleProvider" 
      applicationName="/" 
      type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
  </providers>
</roleManager>

Como você pode ver, o primeiro provedor está configurado para usar um connectionString chamado LocalSqlServer - que também é geralmente declarado no machine.config:

<add name="LocalSqlServer" 
     connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" 
     providerName="System.Data.SqlClient"/>

E este é projetado para usar um banco de dados baseado em arquivo local que será criado se ele ainda não existir.

Assim, para obter papéis de trabalho em seu site, você deve ammend seu web.config raiz para algo como:

<roleManager enabled="true">
  <providers>
    <clear />
    <add name="AspNetSqlRoleProvider" 
      connectionStringName="YourConnectionStringName" 
      applicationName="/" 
      type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
  </providers>
</roleManager>

Usando o elemento irá remover todos os provedores previamente definidos para esse tipo.

Outras dicas

Quando você especificar a opção AttachDBFilename na seqüência de conexão você está na verdade pedindo sua-muito-próprio-just-in-provisionada em tempo instância do SQL Server, também conhecido como o 'instância de usuário'. Esta instância é criada, pedindo a instância 'master' (o. \ Instância SQLEXPRESS) para configurar uma instância filha, o que implica a cópia do master / modelo / msdb em seu perfil, iniciar um novo processo de SQL Server na sua conta configurado para usar o recém-copiado master / modelo / msdb, em seguida, fazendo esta instância 'criança' para anexar o 'arquivo' especificado como um novo banco de dados. Os detalhes são explicados em SQL Server 2005 Express Edition Instâncias de usuários .

O processo de criação de uma instância de criança é extemamente frágil e quando ele quebra a chamada DB resulta, eventualmente, em um tempo fora erro ao abrir a conexão. No seu caso, parece que as quebras de processos em alguns casos (quando chegar à parte protegida do site). Por que ele quebra, é muito difícil de adivinhar, sem informação adequada. Olhe para o Problemas comuns no artigo ligado e ver se algum se aplica a você. Além disso, verifique o log de eventos do sistema para toda a mensagem porque as instâncias criança não pode iniciar ou não pode abrir o arquivo MDF. Note-se que um erro comum é pedir para o mesmo arquivo físico com AttachDBFilename sob diferentes credenciais:. Cada credencial irá iniciar a sua própria instância 'criança' e só o primeiro terá êxito em prender o banco de dados desejado

Eu tive o mesmo problema que era devido aos serviços de servidor SQL que está sendo desativado.

Verifique sob services.msc para ver se o serviço sqlexpress está em execução. Se é um cheque para ver se você tem SQL Express instalado em sua máquina

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