1

在这篇文章之后,我构建了一个托管在 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来构建一个 MSI 或 EXE,它将同时安装服务和 ASP.NET 应用程序,因此不必手动完成。我能够成功创建执行此操作的 Advanced Installer 项目,它实际上安装了 ASP.NET 应用程序和 Windows 服务都很好,它也启动了我的 Windows 服务。然而真正奇怪的是,当我运行应用程序时,我发现我的服务代码无法接收任何多播数据。它似乎阻止了那行代码,我从来没有得到任何数据。有谁知道为什么会发生这种情况?在进行高级安装程序安装时,我尝试使用 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 安装时。当我手动安装时,它工作正常。

4

3 回答 3

0

服务被配置为以用户身份运行。当您使用不同的方法安装时,这会有所不同吗?

你在这两种情况下使用相同的端口号吗,如果不是,它可能是防火墙。

99% 确定你已经检查过了,但是在使用高级安装程序安装后检查服务是否正在运行。

检查事件日志以了解服务问题。

于 2013-01-29T15:43:12.440 回答
0

我最初认为这些家伙说这是用户凭据的问题。但是,由于您在这两种情况下都说服务安装在 LocalSystem 下,所以问题似乎出在其他地方。

我建议您首先检查系统“事件查看器”是否有任何有关您的消息无法启动的消息,也许在那里您可以找到有关失败案例的更多信息。

如果您在那里找不到更详细的信息,我建议您进行一些逆向工程,看看 InstallUtil 做什么而 Advanced Installer 不做什么,或者反过来。高级安装程序随Repackager 工具一起提供。您可以使用此工具来捕获运行“InstallUtil”时执行的系统更改,方法是在 Repackager 要求安装包(例如记事本)时向它提供一个虚拟可执行文件。

当 Repackager 启动 Notepad 时,将其保持打开状态并运行服务的安装命令,在服务完成安装后,关闭 Notepad 并让 repackager 继续其工作。然后分析它生成的新项目,看看捕获了哪些资源,比如文件、注册表、服务等...

您还可以捕获 Advanced Installer 创建的安装包,以查看从中安装的服务是否为您的服务创建了更少或更多的注册信息。

于 2013-01-30T08:11:32.867 回答
0

可能是您的 Windows 服务运行时没有足够的凭据来执行此操作。为了测试这一点,我建议尝试更改用于服务的用户帐户,看看是否有任何不同。

为此,请转到服务小程序(启动、运行、键入services.msc)。找到您的服务,右键单击,属性,“登录”选项卡,选择“此帐户”并选择可以运行该服务的管理员用户帐户。

于 2013-01-29T15:46:43.440 回答