SQLExpressデータベースファイルの自動作成エラーの取得” AspNetSqlMembershipProviderを使用しているが、接続文字列がSQL Server 2005へのサイトの場合
-
05-07-2019 - |
質問
ルートディレクトリは公開されているが、「管理者」が ASP.NET v2.0
のWebサイト(Webアプリケーションではない)を持っています。サブディレクトリには認証が必要です。セットアップに関するすべては非常に汎用的です。ルートweb.configで定義された接続文字列と標準の AspNetSqlMembershipProvider
プロバイダーを使用し、ASP.NETログインコントロールを使用しています。
Adminディレクトリのweb.configは、ユーザーに"管理者"が必要であることを指定します。役割。
SQL Server 2008
を使用していますが、接続文字列は良好です。すべてのルートレベルページはデータ駆動型であり、すべて正常に機能します。
プロバイダーの構成は問題ないようです。
ログインすると、ログインコントロールの" OnLoggedIn
"イベントが発生します。
そのイベントコードの最後の行は、 Admin / Default.aspx
ページにリダイレクトされます。 " OnLoggedIn"のブレークポイント私の管理ディレクトリにリダイレクトするまですべて順調であることを示しています...そして...
...そしてそれから私は待ちます...そして待ちます...
そして" SQLExpressデータベースファイルの自動作成エラー
。が発生したことを知らせるエラーが表示されます。
世界でSQL Server Expressファイルを突然作成しようとするのはなぜですか?接続文字列が突然無視されるのはなぜですか?
1つの奇妙な手がかり:" OnLoggedIn"の最後の行の直前私がこれに入れたイベント:
bool blnTest = User.IsInRole("Admin");
blnTest = true
かどうかを確認したい。
何が起こるかというと、プロセスはこの行に到達し、待機します...そして最終的に、SQL Server Expressデータベースにアクセスできないことを通知します。ユーザーの役割を決定するための参照(私のコードまたは舞台裏のいずれか)は、間違ったデータベースを呼び出しているようです。
編集:Argh、時々 blnTestをテストするときに待機します。その他の場合は、値をすぐに" false;"として報告します。
解決
コメントによると、サイトのロールプロバイダーを明示的に設定していないようです。
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というconnectionStringを使用するように構成されています。これは通常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>
&lt; clear /&gt;の使用要素は、そのタイプに対して以前に定義されたすべてのプロバイダーを削除します。
他のヒント
接続文字列で AttachDBFilename
オプションを指定すると、実際には、「ユーザーインスタンス」とも呼ばれる非常に独自のタイムプロビジョニングされたSQL Serverインスタンスを要求しています。このインスタンスは、「マスター」インスタンス(。\ SQLEXPRESSインスタンス)に子インスタンスのプロビジョニングを要求することで作成されます。これは、マスター/モデル/ msdbをプロファイルにコピーし、使用するように構成されたアカウントで新しいSQL Serverプロセスを開始することを意味します新しくコピーされたmaster / model / msdb、この「子」インスタンスに、指定された「ファイル」を新しいデータベースとしてアタッチするように要求します。詳細については、 SQL Server 2005 Express Editionユーザーインスタンス。
子インスタンスを作成するプロセスは非常に脆弱であり、DB呼び出しを中断すると、接続を開いたときに最終的にタイムアウトエラーが発生します。あなたの場合、プロセスが一部のケースで中断しているようです(サイトの保護された部分に到達したとき)。壊れる理由は、適切な情報なしでは推測するのが非常に困難です。リンクされた記事の[一般的な問題]を見て、該当するものがあるかどうかを確認します。また、子インスタンスが開始できない理由、またはMDFファイルを開けない理由については、システムイベントログを確認してください。よくある間違いは、異なる資格情報でAttachDBFilenameを使用して同じ物理ファイルを要求することです。各資格情報は独自の「子」インスタンスを開始し、最初のインスタンスのみが目的のデータベースのアタッチに成功します。
SQLサーバーのサービスが無効になっているため、同じ問題が発生しました。
services.mscで、sqlexpressサービスが実行されているかどうかを確認します。マシンにsql expressがインストールされているかどうかを確認する場合