2012-02-08 4 views
2

私はSOに関する同様の質問は数多くあることを認識していますが、警告があります。.NETのさまざまなコンポーネント間で構成設定を共有する

基本的な前提は予測可能です:私はいくつかのコンポーネントから構成された製品を継承しました。これらのコンポーネントはすべていくつかの設定を共有していました。現在のところ、これらのコンポーネントは、接続文字列(blegh)を取得するためにハッシュパスワードを使用してWebサービスを呼び出しますが、Webサービスと設定値を必要とするNTサービスとの間でWindows起動時に競合条件が発生することがあります。

レジストリまたはmachine.configという1つの安全な場所からこれらの設定を共有できる洗練されたソリューションを作成したいと考えています。これらのいずれかが単一のデプロイメント環境であれば簡単に実装できますが、ここで問題となるのは、コンポーネントの1つがクリックワンアプリケーションです。

一言で言えば、私の質問は次のとおりです。クリック一回の展開にも反映される構成設定のための集中化されたメカニズムを作成するにはどうすればよいですか。私の知る限り

、これらのソリューションの両方の共有設定ファイルのローカルコピーの利用可能性に依存する:私が考えた

オプションクリック1回では機能しません。クリックワンスアプリケーションのための私達のデプロイメント環境について注意する

2つのこと:

  • 展開は、このような接続文字列などの構成設定が普遍的に適用され、社内LANのネットワーク内で常にあります。
  • インストール時にクリックワンアプリケーションと一緒にパッケージ化された構成設定は、その後の展開で上書きするのが安全です。
+0

あなたが現在使用しているWebサービスもローカルマシンでもホストされていると私の前提で正しいですか?集中オプションを含めることはできませんか? – Polity

+0

クライアントは、集中オプションが使用可能なデプロイメント環境を保証することはできません。 – staterium

+0

その場合、私はあなたの現在の実装がそれほど悪くないことを示唆します。これは、ほとんどの信頼環境で動作し、容易に拡張可能です。競合状態は、ミューテックスを使用して起動の順序を保証することによって簡単に克服することができます。 – Polity

答えて

0

コメントに示されているように、Webサービスはセキュリティ上の問題に敏感ではなく、集中化されたソリューションを保証するため、現在のソリューションはまともな方法であることをお勧めします。競合状態を克服するために、mutexを使用してクライアントにサーバーが起動するのを待たせることができます。例コード:

string mutexName = "C01F6FBB-50E9-4BFA-AFBA-209C316AE9FB"; 
TimeSpan waitInterval = TimeSpan.FromSeconds(1d); 

// Server sample 
System.Threading.Tasks.Task.Factory.StartNew(() => 
{ 
    // similate some startup delay for the server 
    Thread.Sleep(TimeSpan.FromSeconds(5)); 

    using (Mutex mutex = new Mutex(true, mutexName)) 
    { 
     Console.WriteLine("Server: Good morning!"); 

     // Do server business, ensure that the mutex is kept alive throughout the server lifetime 
     // this ensures that the application can always check whether the server is available or not 
     Thread.Sleep(TimeSpan.FromSeconds(5));  
    } 
}); 

// Application sample 
System.Threading.Tasks.Task.Factory.StartNew(() => 
{ 
    Console.WriteLine("Application: Checking the server..."); 

    bool mutexOpened = false; 

    while (!mutexOpened) 
    { 
     try 
     { 
      using (Mutex mutex = Mutex.OpenExisting(mutexName)) 
      { 
       mutexOpened = true; 
      } 
     } 
     catch (WaitHandleCannotBeOpenedException) 
     { 
      Console.WriteLine("Application: Server is not yet ready...."); 

      // mutex does not exist yet, wait for the server to boot up 
      Thread.Sleep(waitInterval); 
     } 
    } 

    // Server is ready, we can do our application business now 
    // note that we dont need to preserve the mutex anymore. 
    // we only used it to ensure that the server is available. 
    Console.WriteLine("Application: Good morning to you!"); 
}); 

Console.ReadLine(); 

関連する問題