為使用 AspNetSqlMembershipProvider 的站點獲取“SQLExpress 數據庫文件自動創建錯誤”,但連接字元串是 SQL Server 2005
我有一個
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 時它會等待。其他時候,它會立即將該值報告為“假”。
根據您的評論,您似乎沒有為您的站點明確配置角色提供程序。
如果您的 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>使用 <clear /> 元素將刪除之前為該類型定義的所有提供程序。