7

ASP.NET v2.0ルート ディレクトリが公開されている Web サイト (Web アプリケーションではない) がありますが、"Admin" サブディレクトリには認証が必要です。セットアップに関するすべてが非常に一般的です。ルート web.config で定義された接続文字列と標準AspNetSqlMembershipProviderプロバイダーを使用し、ASP.NET ログイン コントロールを使用しています。
Admin ディレクトリの web.config は、ユーザーが「管理者」ロールを持っている必要があることを指定します。

を使用しSQL Server 2008ていますが、接続文字列は良好です。すべてのルート レベル ページはデータ ドリブンであり、すべて正常に動作します。
プロバイダーの構成は問題ないようです。

ログインすると、Login コントロールの " OnLoggedIn" イベントが発生します。
そのイベント コードの最後の行で、自分のAdmin/Default.aspxページにリダイレクトされます。「OnLoggedIn」のブレークポイントは、管理ディレクトリにリダイレクトされるまではすべて問題ないことを示しています...そして...

...そして私は待ちます...そして待ちます...

そして、「SQLExpress database file auto-creation error. 」が発生したというエラーが表示されます。

なぜ突然 SQL Server Express ファイルを作成しようとするのでしょうか? 接続文字列が突然無視されるのはなぜですか?

1 つの奇妙な手がかり: 「OnLoggedIn」イベントの最後の行の直前に、次のように入力しました。

bool blnTest = User.IsInRole("Admin");

かどうか見たかったblnTest = true
何が起こるかというと、プロセスがこの行にヒットし、待機し、最終的に SQL Server Express データベースにアクセスできないというメッセージが表示されます。ユーザーの役割を決定するための参照 (コード内または舞台裏のいずれか) が間違ったデータベースを呼び出しているようです。

編集:ああ、blnTest をテストすると、時々待機します。それ以外の場合は、値がすぐに「false」として報告されます。

4

3 に答える 3

13

コメントによると、サイトのロール プロバイダーを明示的に構成していないようです。

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>

<clear /> 要素を使用すると、そのタイプに対して以前に定義されたすべてのプロバイダーが削除されます。

于 2009-09-09T23:01:22.693 に答える
1

接続文字列でオプションを指定するとAttachDBFilename、実際には、時間内にプロビジョニングされた非常に独自のSQL Serverインスタンス(別名「ユーザーインスタンス」)が要求されます。このインスタンスは、「master」インスタンス(。\ SQLEXPRESSインスタンス)に子インスタンスのプロビジョニングを依頼することで作成されます。これは、master / model / msdbをプロファイルにコピーし、アカウントを使用するように構成されたアカウントで新しいSQLServerプロセスを開始することを意味します。新しくコピーされたmaster/model / msdbは、この「子」インスタンスに、指定された「ファイル」を新しいデータベースとして添付するように要求します。詳細については、SQL Server 2005ExpressEditionのユーザーインスタンスで説明されています。

子インスタンスを作成するプロセスは非常に脆弱であり、DB呼び出しが切断されると、接続を開くときに最終的にタイムアウトエラーが発生します。あなたの場合、プロセスが壊れている場合があるようです(サイトの保護された部分に到達したとき)。それが壊れた理由は、適切な情報なしでは推測するのが非常に困難です。リンクされた記事の一般的な問題を見て、該当するものがあるかどうかを確認してください。また、システムイベントログで、子インスタンスを起動できない、またはMDFファイルを開くことができない理由に関するメッセージを確認してください。よくある間違いは、異なるクレデンシャルでAttachDBFilenameを使用して同じ物理ファイルを要求することです。各クレデンシャルは独自の「子」インスタンスを開始し、最初のインスタンスのみが目的のデータベースのアタッチに成功します。

于 2009-09-09T22:30:33.243 に答える