常见疑难杂症:添加提供器时别忘了先设置

【原文地址】 Common Gotcha: Don't forget to <clear></clear>when adding providers
【原文发表日期】 Monday, November 20, 2006 11:22 PM

最近,我帮了几个人,他们在如何在web.config文件里添加新的成员(Membership),角色(Role)和用户信息(Profile)提供器(provider)上遇上了问题。如果你会在你的web.config文件里添加提供器声明的话,请继续读下去,了解一下如何避免一个常见的问题。

症状:

你要配置ASP.NET 2.0来在远程SQL数据库里存储你的成员/角色管理/用户信息数据。为达成这个目的,你首先使用aspnet_regsql.exe工具在数据库里生成了合适的数据定义。你决定不在你的web.config文件里覆盖"LocalSqlServer"这个连接字符串,而是象下面这样,在你的web.config文件里注册一个新的提供器 (注:下面这个注册有个bug,所以别拷贝/粘贴):

<membership>

<providers>
<addname="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="MyDatabase"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""
applicationName="/"
/>
</providers>

</membership>

在注册上面这个提供器时,你很小心地明确设置了applicationName属性,因此避免了另外一个非常常见的问题

但,当你在一个没有SQL Express的机器上运行你的应用时,你看到了有点奇怪的行为。你也许会得到象这样的出错信息:

An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified) (在建立到服务器的连接时发生了错误。 当连接到 SQL Server 2005时,连接失败可能是因为在默认设置下 SQL Server 不允许远程连接这个事实导致的。(提供器:SQL网络接口,错误:26 - 查找指定服务/实例时出错))

你也许会发现web管理工具在连接到你的数据库时也有问题,或者你用它创建的角色/用户没有在上面配置的数据库里正确地存储下来。

问题的起因:

上面这个问题的根本原因取决于新的提供器是如何在web.config 文件注册的。

web.config 文件里的 <providers> 节是以一个集合的方式实现的,所以有可能同时注册多个提供器。这是很有用的,当你要用一个成员储存来认证一些用户,而用另外一个成员储存来认证另外的用户时。

在默认情形下,ASP.NET 2.0在你的机器上的根web.config文件里注册了一批默认的 SQL Express提供器,在你第一次访问时,将在你的应用的/app_data 文件夹中生成一个SQL Express数据库,来存储/管理成员/角色/用户信息数据。因为这是在机器范围的层次上注册的,在默认情形下,所有的提供器集合都继承了这注册信息。除非你明确地设置 <clear/> 或者覆盖(override)了继承的值,你的应用会使用这默认注册的成员/角色/用户信息提供器。

因为上面这个web.config文件只是简单地添加了一个新的提供器,没有清除或替代默认的提供器注册信息,上面的应用现在配置了2个Membership提供器。当你在编码中调用Membership.CreateUser()时,ASP.NET会试着在这2个成员数据库里创建这个用户,如果你在你的系统上没有安装SQL Express的话,针对该数据库的用户创建就会失败,导致上述的错误或奇怪行为。

如何解决这个问题:

除非你想注册多个成员,角色或用户信息数据库(这样的情形应该是很少的),你应该在web.config文件里你的 <add/> 语句之前无例外地添加明确的 <clear/> 指令:

<membership>

<providers>
<clear/>
<addname="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="MyDatabase"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""
applicationName="/"
/>
</providers>

</membership>

这将会确保你的应用不会继承任何默认的提供器注册设置。

注意,你必须对你注册的每个提供器声明都这么做。所以,如果你要添加 <roles> 和 <profile> 提供器,确认你在它们的提供器节也添加了 <clear/> 指令。

希望本文对你有所帮助,

Scott

附注:点击这里浏览一下以前的SP.NET Tips/Tricks, Gotchas, and Recipes文章

你可能感兴趣的:(sql,应用服务器,Web,浏览器,SQL Server)