与えられた:
- アプリケーション - デスクトップ GUI (WPF) .NET アプリ
- アプリケーションを監視する Windows サービス (.NET も)
Windows サービスは、アプリケーションが正常であることを確認するために定期的に「ping」を実行します (そうでない場合は、winservice がアプリケーションを再起動します)。
名前付きパイプを介して「ping」を実装するつもりでした。簡単にするために、WCF を使用することにしました。アプリケーションは、WCF サービスをホストします (1 つの操作 Ping が何かを返します)。Windows サービスは、この WCF サービスのクライアントであり、タイマーに基づいて定期的に呼び出します。
Windows 7
では以上です。Windows サービスは LocalService の下で実行されています (セッション #0)。
デスクトップ アプリケーションは、現在ログインしているユーザー (セッション #1) で実行されています。
問題:
Windows サービスは、デスクトップ アプリケーションで作成され、リッスンされている WCF エンドポイント (NetNamedPipeBinding を使用) を認識できません。つまり、wcf プロキシ経由の呼び出しで、「パイプ エンドポイント 'net.pipe://localhost/HeartBeat' がローカル マシンに見つかりませんでした」という例外が発生します。
別のデスクトップ アプリケーション (セッション #1) がエンドポイントを認識できるため、コードは問題ないと確信しています。
明らかに、ここでは、Win32 システム オブジェクトの分離のためのセキュリティ関連の事柄を扱っています。しかし、私が遭遇した制限を回避する方法があるはずです。
私は WCF のアプローチを犠牲にして、生の NamedPipe の方法に進むことができます。