WindowsサービスでホストされているWCFサービスがあります。ホスト(.exe)とサービスライブラリ(.dll)の2つのアセンブリがあります。サービスライブラリが更新されると、ライブラリを置き換えるためにサービスを停止する必要があります。サービスを再開せずにライブラリを置き換えるような、IISと同様の機能を持っていたいと思います。 それは可能でしょうか?サービスを再起動せずにWCFサービスライブラリを置き換えます。
答えて
IISはこれを達成するためにシャドウコピーと呼ばれるものを使用します。あなたはあなたのサービスホストに似た何かを実装することができます。基本的には、サービスを開始する前に.DLLを別の場所にコピーし、そのコピーからホストにサービスクラスをロードさせることが考えられます。次に、ホストは、元のファイルへの変更をリスンするファイルシステムモニタを設定します。 1つを検出すると、サービスを停止し、新しいファイルをコピーして再起動します。
EDIT
(1)特定のタイプライブラリ内のクラスを使用してのServiceHostを開始するには、リフレクションを使用する必要があると思います。次のようなものがあります。
Assembly myAssembly = Assembly.LoadFile(path);
Type serviceType = myAssembly.GetType(className);
ServiceHost serviceHost = new ServiceHost(serviceType);
LoadFileが依存関係をどのように解決するかは不明です。この作業を行うには、Assembly.ModuleResolveイベントをフックする必要があります。
(2)ファイルシステムのモニターには若干のオーバーヘッドが発生しますが、私の経験では最小限です。いずれにしても、更新されたDLLのインストーラを使用しない限り、これは本当に唯一のオプションです。
(3)ファイルがロックされている理由がわかりません。自分で解決する必要があります。
Peterには1つの提案があります。サイズや保証の可否によっては、インフラストラクチャを少なくとも2台のクラスタ化されたサーバーに移動することもできます。これにより、一度に1つずつ更新できますが、他の1つは要求を引き続き受け取ります。あなたが正しくバージョンを変えれば(契約の変更==新しいメソッド)、この方法はうまく動作します。古いクライアントは新しいビットに関係なく同じデータを引き続き取得します。
クラスタ化されたサーバーは実用的なソリューションになる可能性がありますが、停止があるかどうかにかかわらず、サービスの再起動なしにlibを置き換えることに興味があります。 – NDeveloper
- 1. NotificationListenerServiceが再起動せずに再起動できない
- 2. プロセスを再起動せずにAzure WebロールでIISを再起動することはできますか?
- 3. Android - 再起動せずにアクティビティに切り替え
- 4. マップを置換せずにマップ内のマルチパートメッセージスキーマを置き換える方法
- 5. 私のWCFサービスライブラリに `System.Windows.Forms`リファレンスを追加できません
- 6. サーバーを再起動せずにDjango ChoiceFieldを再投入する
- 7. Firefoxを再起動せずにuser_prefを再ロードする方法
- 8. サービスをホストせずにASyncパターンをWCFサービスに追加せずにSilverlight用のWCFプロキシを生成します
- 9. 再起動せずにWindowsイベントログサービスを再初期化する
- 10. Webサービスからの提案をリロードせずにSilverlight AutoCompleteBoxポップアップを再起動
- 11. mysqldを再起動せずに.sqlスキーマを再ロード
- 12. WCFビルトインJavascriptSerializerをNewtonsoft Json.Net jsonシリアライザに置き換えます。
- 13. 既存のmysqlデータベースを置き換えずにWamp Serverを再インストールする
- 14. Rを再起動せずにRcppパッケージDLLをアンロードできますか?
- 15. フルブラウザを再起動せずにJavaアプレットにロードされたダイナミックライブラリを置き換えるにはどうすればよいですか?
- 16. Androidサービスを再起動しますか?
- 17. サービスpostgresqlを起動できません
- 18. 再起動せずにカーネルドライバをアンロードすることはできますか?
- 19. プロット全体を再描画せずに凡例や軸を置き換える方法はありますか?
- 20. アンドロイド:サービスを再起動
- 21. WCFデュプレックスサービス。サービスの再起動時にクライアントがドロップされる
- 22. フォークを起点(github)で完全に置き換えます
- 23. Firefoxを再起動せずにプログラムによるJavaScriptサポートの切り替え
- 24. .NETで機能を置き換える使用せず、文字列内の文字を置き換える
- 25. Gpsを再起動できません
- 26. nginxを再起動できません
- 27. tomcat6サーバを再起動せずにサーブレットをリロードする方法
- 28. Xorgを再起動せずにXINITRCをリロードする
- 29. Xcodeを再起動せずにドキュメントセットをリロードする
- 30. WCFのデフォルトのJSONシリアル化を置き換えます
anser Peterありがとうございます。ちょうどホストの再起動を意味するものを理解したいと思いますが、とにかくWindowsサービスを再起動する必要がありますか? – NDeveloper
いいえ。Windowsサービスアプリケーションは再起動しません。 「再起動」とは、サービスをホストしているServiceHostオブジェクトを閉じ、新しいDLLをコピーした後、新しいServiceHostオブジェクトを作成して開始することを意味します。 –
そのようなサービスがたくさんあるのは問題ではないでしょうか。私は、ファイルワッチャーがたくさんあるため、システムのパフォーマンスに影響しないのでしょうか?また、正確なディレクトリからアセンブリを読み込むようにServiceHostに指示する方法もあります。 – NDeveloper