我在本文之后构建了一个托管在Windows服务中的WCF服务:http://msdn.microsoft.com/en-us/library/ms733069.aspx。服务中的代码的一部分是加入多播组并侦听向组广播的数据。然后它处理它。我发现当我使用InstallUtil手动安装服务时,它工作正常。要手动安装,请执行以下操作:
该服务在Windows中安装正常,然后我启动它。然后我运行我的ASP.NET应用程序,它是服务的客户端,它运行正常。该服务接收并处理数据就好了。
但是,我尝试使用Advanced Installer构建一个MSI或EXE,它将同时安装服务和ASP.NET应用程序,因此不必手动完成。我能够成功创建执行此操作的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安装时才会发生这种情况。当我手动安装时,它工作正常。
答案 0 :(得分:0)
服务配置为以用户身份运行。使用不同的方法安装时会有所不同吗?
在这两种情况下,您是否使用相同的端口号,否则可能是防火墙。
99%确定您已对其进行了检查,但在使用高级安装程序安装服务后检查该服务是否正在运行。
检查事件日志中是否存在服务问题。
答案 1 :(得分:0)
可能是您的Windows服务没有运行时有足够的凭据来执行此操作。为了测试这一点,我建议尝试更改用于服务的用户帐户,看看是否有任何区别。
要执行此操作,请转到服务小程序(启动,运行,键入 services.msc )。找到您的服务,右键单击,属性,“登录”选项卡,选择“此帐户”,然后选择该服务可以在其下运行的管理员用户帐户。
答案 2 :(得分:0)
我最初认为这些人说这是用户凭据的问题。但是既然你说在两种情况下服务都是在LocalSystem下安装的,那么问题似乎就在其他地方。
我建议您首先检查系统“事件查看器”,查看有关您的邮件无法启动的任何消息,也许您可以找到有关失败案例的更多信息。
如果你在那里找不到更多详细信息,我建议进行一些逆向工程,看看InstallUtil做了什么,而Advanced Installer没做,或者反过来。高级安装程序随Repackager tool一起提供。您可以使用此工具捕获运行“InstallUtil”时执行的系统更改,方法是在Repackager请求安装程序包时为其提供虚拟可执行文件,例如记事本。
当Repackager启动记事本时,保持打开并运行服务的安装命令,在服务完成安装后,关闭记事本并让重新打包程序完成其工作。然后分析它生成的新项目,以查看已捕获的资源,如文件,注册表,服务等......
您还可以捕获Advanced Installer创建的安装包,以查看从中安装的服务是否为您的服务创建了更少或更多的注册信息。