0

私の web.config ファイルには、ローカル用とライブ用の 2 つの SQL Server 接続文字列があります。

<connectionStrings>
    <remove name="LocalSqlServer" />
    <add name="LocalSqlServer" connectionString="[removed]" providerName="System.Data.SqlClient"/>
    <add name="LiveSqlServer" connectionString="[removed]" providerName="System.Data.SqlClient"/>
</connectionStrings>

次に、「localhost」またはライブサーバーでサイトを実行しているかどうかに応じて、基本的に接続文字列を設定する「utils」シングルトンクラスがあります。

if (Environment.MachineName.ToUpper() == MyOwnConfig.GetAppSettingsValue(ConfigKeys.localhost).ToUpper()) {
    this.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString();
    //MembershipProvider provider = Membership.Providers["LocalAspNetMemberSqlProvider"];
    //RoleProvider role = Roles.Providers["LocalAspNetMemberSqlProvider"];
}
else {
    this.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["LiveSqlServer"].ToString();
    //MembershipProvider provider = Membership.Providers["LiveAspNetMemberSqlProvider"];
    //RoleProvider role = Roles.Providers["LiveAspNetMemberSqlProvider"];
}

データベース クラスは、utils クラスの connectionString プロパティを使用するだけです。これはすべて正常に機能するため、サイトをローカルに配置すると、構成ファイルの接続文字列などを変更せずにライブにアップロードするだけで、ライブ データベースの使用が開始されます。

現在、私は自分のサイトに「メンバーシップ」を実装しており、いくつかの webmethods を使用するための ajax のために、現在ログインしているユーザーのテキスト フィールドに providerUserKey を保存しています。私の Web メソッドは、このキーが認証されていることを確認します。例えば

ajaxCreds.ajaxID1 = ((MembershipUser)Membership.GetUser()).ProviderUserKey.ToString();

質問: 質問は、このメンバーシップが LIVE データベースからのものか、ローカル データベースからのものかをどのように知ることができるかということです。メンバーシップ/プロバイダーの行に追加した (コメント アウトされた) Web 構成からわかるように、上記の Membership.getUser() コマンドでそれらを使用する方法がわかりません。

代替手段...これは良い方法ですか?または、ライブにアップロードするときに web.config ファイルを編集する方が簡単ですか?

どうもありがとう

4

2 に答える 2

1

私はあなたがこれをすべて理解したことを称賛しますが、ほとんどの人はこのようにそれをしません。通常、ユーザーはデプロイメントマネージャーまたはその他のビルドシステムを使用して、サーバーとローカルで異なるweb.config値を設定します。

デプロイメントの変更に関するリンクは次のとおりです。接続文字列でWeb.Configトランスフォームを使用するにはどうすればよいですか?

于 2012-11-11T13:22:46.810 に答える
1

この記事を読むことをお勧めします:

http://blogs.msdn.com/b/schlepticons/archive/2010/07/22/modifying-asp-net-providers-at-runtime.aspx

他の人も同様のことをしようとしていたことがわかります。そして、これが成功する方法です。解決策 (調整されている場合) は、ニーズに似ている可能性があります。

  • すべてのプロバイダーを web.config に入れます
  • App_Start で、どちらがデフォルトになるかを調整します (環境に基づいて)
  • Membershipプロバイダー キーの必要に応じて API を利用できます
  • 名前でプロバイダーを検索する必要はありません

注:void Application_Start(object sender, EventArgs e)実装を微調整する必要がありますが、アイデアはそこにあります

注2: あなたがやろうとしていることは間違いなく例外ではありません. 環境に基づく構成は非常にスマートです。達成しなければならないことは、標準的な API の使用法です。たとえば、Manager パターンを介した呼び出しです。

  • System.Web.Security.Membership
  • System.Web.Security.Roles

名前によるプロバイダーへの呼び出しではありません。

于 2012-11-11T13:43:22.410 に答える