为使用AspNetSqlMembershipProvider的站点获取“SQLExpress数据库文件自动创建错误”,但连接字符串是SQL Server 2005

时间:2009-09-09 22:17:09

标签: asp.net sql-server-2008 sql-server-express provider

我有一个ASP.NET v2.0网站(不是网络应用程序),其中根目录是公共的,但“Admin”子目录需要身份验证。关于设置的一切都非常通用 - 我使用了根web.config和标准AspNetSqlMembershipProvider提供程序中定义的连接字符串,并且我使用的是ASP.NET登录控件。
Admin目录中的web.config指定用户必须具有“Admin”角色。

我正在使用SQL Server 2008,我的连接字符串很好;每个根级页面都是数据驱动的,它们都可以正常工作 提供商配置似乎很糟糕。

登录时,登录控件的“OnLoggedIn”事件会触发 该事件代码中的最后一行将我重定向到我的Admin/Default.aspx页面。我在“OnLoggedIn”中的断点告诉我一切顺利,直到重定向到我的Admin目录......然后......

......然后我等等......等等......

然后我收到一个错误,告诉我它经历过“SQLExpress database file auto-creation error。”

为什么世界上突然想要创建SQL Server Express文件?为什么突然忽略我的连接字符串?

一个奇怪的线索:就在“OnLoggedIn”事件的最后一行之前,我把它放在:

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

我想知道blnTest = true是否 会发生什么,这个过程会遇到这一行...并等待...并最终告诉我它无法访问SQL Server Express数据库。似乎任何引用(在我的代码中或在幕后)来确定用户的角色,都会调用错误的数据库。

编辑:当我测试blnTest时,它会等待 等等。其他时候,它会立即将值报告为“false”。

3 个答案:

答案 0 :(得分:12)

根据您的评论,您似乎没有为您的网站明确配置角色提供程序。

如果您的web.config中的所有内容都是:

<roleManager enabled="true" />

然后你依赖于在配置hieracrchy(machine.config,global web.config等)中进一步声明的默认提供者

在machine.config中你可能有类似的东西:

<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>

如您所见,第一个提供程序配置为使用名为LocalSqlServer的connectionString - 它通常也在machine.config中声明:

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

这是为了使用基于本地文件的数据库,如果它尚不存在,将会被创建。

因此,为了让角色在您的网站上运行,您应该将您的根web.config修改为:

<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>

使用&lt; clear /&gt; element将删除该类型的所有先前定义的提供程序。

答案 1 :(得分:1)

当您在连接字符串中指定AttachDBFilename选项时,您实际上是在寻求您自己的即时配置的SQL Server实例,即“用户实例”。通过要求'master'实例(。\ SQLEXPRESS实例)配置子实例来创建此实例,这意味着将master / model / msdb复制到您的配置文件中,在您的帐户下启动一个新的SQL Server进程,配置为使用刚刚复制的master / model / msdb,然后要求这个'child'实例将指定的'file'作为新数据库附加。详细信息在SQL Server 2005 Express Edition User Instances中解释。

创建子实例的过程非常脆弱,当它打破连接时,DB调用最终会导致超时错误。在您的情况下,似乎该过程在某些情况下(当您到达站点的受保护部分时)中断。如果没有适当的信息,很难猜到它为什么会破裂。查看链接文章中的常见问题,看看是否适用于您。还要检查系统事件日志中是否有任何消息导致子实例无法启动或无法打开MDF文件的消息。请注意,常见的错误是在不同的凭据下请求具有AttachDBFilename的相同物理文件:每个凭证将启动其自己的“子”实例,并且只有第一个凭证将成功附加所需的数据库。

答案 2 :(得分:0)

我遇到了同样的问题,原因是sql server的服务被禁用了。

在services.msc下检查以查看sqlexpress服务是否正在运行。如果检查您的计算机上是否安装了sql express