我有一个WCF服务器,我可以作为服务或Windows窗体应用程序运行。当我将其作为Windows窗体应用程序运行时,我可以通过我的客户端应用程序连接到它。但是,当我使用相同的代码将其作为服务运行时,我无法连接到它。我已确认该服务正在运行并正在运行。下面是服务器的配置文件。
<system.serviceModel>
<services>
<service name="Cns.TrafficCopService.ManagementService">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/TrafficCop/ManagementService" />
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" contract="Cns.TrafficCopService.IManagementService" />
</service>
</services>
</system.serviceModel>
及其托管代码,在调用OnStart后调用100毫秒:
if (this.serviceHost != null)
{
this.serviceHost.Close();
}
this.serviceHost = new ServiceHost(typeof(ManagementService));
this.serviceHost.Open();
和客户端的配置文件:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IManagementService" />
</wsHttpBinding>
</bindings>
<client>
<endpoint
address="http://localhost:8000/TrafficCop/ManagementService"
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IManagementService"
contract="IManagementService"
name="WSHttpBinding_IManagementService">
</endpoint>
</client>
</system.serviceModel>
答案 0 :(得分:2)
您是否可以发布其余代码来托管服务?
启动服务的类应继承自“ServiceBase”,并应实现“OnStart”和“OnStop”方法。服务控制台调用这些方法来启动和停止服务进程,因此应在这些方法中打开/关闭ServiceHost。只是想知道你是不是也不这样做。
答案 1 :(得分:1)
该服务运行的帐户是什么?我想知道该服务是否无法启动,可能是因为没有权限打开端口。
尝试以您自己的身份运行服务(但作为服务)。如果它有效,则是权限问题。最有可能的是HTTP.SYS权限。
要分配访问权限,请在vista / window 7上使用netsh,或在xp上使用httpcfg。
答案 2 :(得分:0)
您从哪里获取创建服务主机的代码?我的第一个猜测是,当你将它作为服务运行时,你要么不创建ServiceHost,要么你不保留它的引用(所以它被垃圾收集)
答案 3 :(得分:0)
如果你在同一台机器上,我会建议使用NetNamedPipeBinding而不是WSHttpBinding。它更快。如果您需要跨机器使用,可以随时更改回ws-http。
确保您的服务实际上是通过TaskManager运行的。如果没有,请在服务的构造函数中放置一个Debugger.Break()语句,然后逐步查找它无法启动的位置。 Here是一个简洁的步骤,用于在C#中创建Windows NT服务(如果需要)。
答案 4 :(得分:0)
事件日志中没有关于未注册地址的内容?
您是否尝试调试服务(使用visual studio attach to process)?
答案 5 :(得分:0)
您是否检查过您在WinForms应用程序和服务的配置文件中定义了该配置?