【问题标题】:Getting "SQLExpress database file auto-creation error" for site that uses AspNetSqlMembershipProvider, but connection string is to SQL Server 2005为使用 AspNetSqlMembershipProvider 的站点获取“SQLExpress 数据库文件自动创建错误”,但连接字符串是 SQL Server 2005
【发布时间】:2010-11-27 00:13:21
【问题描述】:

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

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

当我登录时,登录控件的“OnLoggedIn”事件会触发。
该事件代码的最后一行将我重定向到我的Admin/Default.aspx 页面。我在“OnLoggedIn”中的断点显示一切都很好,直到重定向到我的管理目录...然后...

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

然后我收到一条错误消息,告诉我它遇到了“SQLExpress database file auto-creation error”。

为什么突然尝试创建 SQL Server Express 文件?为什么突然忽略了我的连接字符串?

一个奇怪的线索:就在“OnLoggedIn”事件的最后一行之前,我输入了这个:

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

我想看看blnTest = true.
发生的情况是该进程到达这条线……并等待……最终告诉我它无法访问 SQL Server Express 数据库。似乎任何用于确定用户角色的参考(无论是在我的代码中还是在幕后)都调用了错误的数据库。

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

【问题讨论】:

  • RoleProvider 的连接字符串是什么?和你的 AuthenticationProvider 一样吗?
  • web.config 的那部分就是这样...

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


【解决方案1】:

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

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

<roleManager enabled="true" />

那么您将依赖于在配置层次结构中进一步声明的默认提供程序(machine.config、全局 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 的连接字符串——它通常也在 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;roleManager&gt;&lt;membership&gt; 部分都有&lt;providers&gt;。似乎它们包含相同的信息。有谁知道我为什么需要两者?
  • 因为您可以拥有不同的角色(例如,您可能想要一个支持继承角色的自定义角色提供程序,同时您对默认的成员资格提供程序感到满意)。最重要的是,如果您仔细观察,您会发现它们是不同的:一个添加了 sqlmembershipprovider,而另一个添加了 sqlroleprovider。
  • 知道 配置属于您网站的 web.config 中的 元素会很有帮助
【解决方案2】:

当您在连接字符串中指定 AttachDBFilename 选项时,您实际上是在请求您自己的即时配置 SQL Server 实例,也就是“用户实例”。此实例是通过要求“主”实例(.\SQLEXPRESS 实例)提供子实例来创建的,这意味着将主/模型/msdb 复制到您的配置文件中,在您配置为使用新复制的 master/model/msdb,然后要求此“子”实例将指定的“文件”附加为新数据库。详情请见SQL Server 2005 Express Edition User Instances

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

【讨论】:

  • 正如我所说,我使用的是 SQL Server 2008,而不是 MDF 文件。我的连接字符串中没有 AttachDBFilename。数据源=MYSERVER;初始目录=WebsiteDB;用户ID=MyUserID;密码=MyPassword;
  • Zhaph 已经解释了为什么使用 LocalSqlServer(即 Express 用户实例)
  • 只是因为我从 cmets 获得了所有详细信息 ;)
  • 谢谢 Zhaph,是的,你成功了,并提醒我记住 machine.config。 Remus,关于 Zhaph“已经”解释了 Express 问题的评论,cmets 的顺序是:我的原始帖子,Nick 关于 RoleProviders 的问题,我对 Nick 的回答,你提到 Express,然后是 Zhaph 的获胜答案。我并没有试图让 Express 工作,我试图完全避免它。
  • @Tom:对不起,汤姆,我的意思不是“已经”以任何方式贬损。我的意思是我可以保持简短的评论,而不是进入细节。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多