この記事に従って、Windows サービスでホストされる WCF サービスを構築しました: http://msdn.microsoft.com/en-us/library/ms733069.aspx。サービスのコードが行うことの一部は、マルチキャスト グループに参加し、グループにブロードキャストされるデータをリッスンすることです。その後、それを処理します。InstallUtil を使用してサービスを手動でインストールすると、正常に動作することがわかりました。手動でインストールするには、次のようにします。
- Visual Studio で MyService プロジェクトをビルドします。
- Visual Studio コマンド プロンプトを右クリックし、[管理者として実行] を選択します。
- MyService.exe ファイルがあるフォルダーに移動します。
- 次のように InstallUtil コマンドを実行します。 installutil.exe MyService.exe
サービスは Windows に正常にインストールされ、開始します。次に、サービスのクライアントである ASP.NET アプリケーションを実行すると、問題なく動作します。サービスはデータを正常に受信して処理します。
ただし、Advanced Installerを使用して、サービスと ASP.NET アプリケーションを一度にインストールする MSI または EXE をビルドしようとしているので、手動で行う必要はありません。これを行う Advanced Installer プロジェクトを正常に作成でき、実際に ASP.NET アプリケーションと Windows サービスの両方が正常にインストールされ、Windows サービスも開始されます。しかし、本当に奇妙なことに、アプリケーションを実行すると、サービス コードがマルチキャスト データを受信できないことがわかりました。そのコード行でブロックされているようで、データを取得できません。なぜこれが起こるのか誰にも分かりますか?Advanced Installer のインストール時に、EXE を使用し、「管理者として実行」を使用しようとしました。これが私のサービスのコードです。
_groupAddress = IPAddress.Parse(_myIPAddress);
_listener = new UdpClient(_myPort);
_groupEP = new IPEndPoint(_groupAddress, _myPort);
_listener.JoinMulticastGroup(_groupAddress);
byte[] _bytes = _listener.Receive(ref _groupEP);
コードの最後の行でブロックされているようで、データをまったく受信しません。これは、Advanced Installer を使用してインストールした場合にのみ発生します。手動でインストールすると正常に動作します。