摘要:常見疑難雜症:添加提供器時別忘了先設定<clear/>
【原文位址】 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,所以別拷貝/貼上):
<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/> 指令:
<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文章。