扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
最近,我帮了几个人,他们在如何在web.config文件里添加新的成员(Membership),角色(Role)和用户信息(Profile)提供器(provider)上遇上了问题。如果你会在你的web.config文件里添加提供器声明的话,请继续读下去,了解一下如何避免一个常见的问题。
症状:
你要配置ASP.NET 2.0来在远程SQL数据库里存储你的成员/角色管理/用户信息数据。为达成这个目的,你首先使用aspnet_regsql.exe工具在数据库里生成了合适的数据定义。你决定不在你的web.config文件里覆盖"LocalSqlServer"这个连接字符串,而是象下面这样,在你的web.config文件里注册一个新的提供器 (注:下面这个注册有个bug,所以别拷贝/粘贴):
在注册上面这个提供器时,你很小心地明确设置了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/> 指令:
这将会确保你的应用不会继承任何默认的提供器注册设置。
注意,你必须对你注册的每个提供器声明都这么做。所以,如果你要添加 <roles> 和 <profile> 提供器,确认你在它们的提供器节也添加了 <clear/> 指令。
希望本文对你有所帮助,
查看本文来源
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者