常見疑難雜症:添加提供器時別忘了先設置

【原文地址】 Common Gotcha: Don't forget to 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>
                
<add name="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/>
                
<add name="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文章

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章