2014-04-16 41 views
0

我有一个WCF服务,该服务在WSHttp端点上运行得非常好,作为ServiceHost下的Windows服务运行。但是由于可伸缩性,我想移动到TCP端点。对于我的生活,我无法弄清楚如何正确承载它。这里是我的主机的OnStart程序,在VB:WCF,Net.Tcp端点,代码优先

Protected Overrides Sub OnStart(ByVal args() As String) 
    If _svcHost IsNot Nothing Then 
     _svcHost.Close() 
    End If 

    _svcHost = New ServiceHost(GetType(AutoTestsDataService), New Uri("net.tcp://" & GetIPv4Address() & ":8000")) 

    Dim metaDataBehavior = _svcHost.Description.Behaviors.Find(Of ServiceMetadataBehavior)() 
    If metaDataBehavior Is Nothing Then 
     _svcHost.Description.Behaviors.Add(New ServiceMetadataBehavior() With {.HttpGetEnabled = False}) 
    Else 
     metaDataBehavior.HttpGetEnabled = False 
    End If 

    _svcHost.AddServiceEndpoint(GetType(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding, "mex") 
    _svcHost.AddServiceEndpoint(GetType(AutoTestsDataService), New NetTcpBinding(SecurityMode.None, False), ServiceName) 

    Dim debugBehavior As ServiceDebugBehavior = _svcHost.Description.Behaviors.Find(Of ServiceDebugBehavior)() 
    If debugBehavior Is Nothing Then 
     _svcHost.Description.Behaviors.Add(New ServiceDebugBehavior() With {.IncludeExceptionDetailInFaults = My.Settings.flagDebug}) 
    Else 
     debugBehavior.IncludeExceptionDetailInFaults = My.Settings.flagDebug 
    End If 

    Try 
     _svcHost.Open() 
    Catch ex As Exception 
     _svcHost.Abort() 
    End Try 
End Sub 

原样,代码编译好,安装精细和Windows服务启动了罚款。但是在端口8000上没有任何监听。我确定Net.Tcp监听器和端口共享服务正常运行。我之所以选择不使用配置文件,是因为我过去遇到过很多问题,而将代码放在配置文件中是不好的,而不是微软希望我相信的东西。代码优先的实现总是比XML更容易理解,对于我来说,上面的代码将所有正确的部分放在正确的位置。它只是拒绝工作。就像我说的我可以坚持使用WSHttp,但我更愿意理解为什么Net.Tcp不工作。

+0

'_svcHost.Open()'抛出?如果是这样,什么是例外? – ErnieL

+0

否定的,所有的行为都应该如此,在端口8000上只是没有监听。根本没有异常。 –

+0

您是否试过http://stackoverflow.com/questions/1479081/wcf-there-was-no-endpoint-listening-at-net-tcp-querier-svc-that-c​​ould-a?rq=1 –

回答

2

确定WCF服务侦听器在启动过程中执行的操作的最佳方法是启用WCF跟踪。因此,我建议您在服务上配置跟踪,该服务应提供有关启动时发生的任何基础异常的详细信息。

WCF跟踪提供故障监视和分析的诊断数据。您可以使用跟踪而不是调试器来了解应用程序的行为方式或错误原因。您还可以关联组件间的错误和处理以提供端到端的体验,包括跨应用程序所有组件的进程里程碑跟踪,例如操作调用,代码异常,警告和其他重要的处理事件。

http://msdn.microsoft.com/en-us/library/ms733025(v=vs.110).aspx

+0

我完全同意,但重点是没有错。 Windows服务启动正常,在我告诉它听的端口上没有任何监听。该服务在WsHttp中也可以很好地工作。 WCF服务在这里不是问题,即使是“Hello World”服务也不行,因为我无法首先添加服务引用。该服务应该在TCP端口8000上监听,但是netstat -a告诉我没有任何端口监听8000.然而,Windows服务运行正常,除了启动和停止消息之外,它的事件日志是空的。 –

+0

我想我理解这个场景......服务启动正常,没有Windows错误,但是netstat确认WCF没有在指定端口上侦听。根据我的经验,在这种情况下(并不少见),WCF跟踪文件经常会发现问题。 – Seymour

+0

我的一些Net.TCP服务无法正常工作,直到Net.Tcp侦听器适配器服务或该计算机上的Windows进程激活服务重新启动时出现问题。如果您重新启动Windows进程激活服务,它应该重新启动两者。 –

1

我能在这里看到的唯一的问题是方法GetIPv4Address()和返回结果是什么。通常,最好的选择是使用localhost,主机名或0.0.0.0。

+0

GetIPv4Address获取我希望服务侦听的接口的特定IP地址。此机器上有多个网络接口。 –