WCF作为应用程序,但不作为服务

时间:2009-03-25 14:24:53

标签: c# .net wcf windows-services

我有一个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>

6 个答案:

答案 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应用程序和服务的配置文件中定义了该配置?