我有一个WCF服务,这个服务在WSHttp端点上运行得很好,在ServiceHost下作为Windows服务运行。但是,由于可伸缩性,我想转移到TCP端点。对于我的生活,我无法弄清楚如何正确地托管它。这是我的主机的OnStart例程,在VB中:
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 :(得分:2)
确定WCF服务侦听器在启动期间执行的操作的最佳方法是启用WCF跟踪。因此,我建议您在服务上配置跟踪,该跟踪应提供有关启动时发生的任何基础异常的详细信息。
WCF跟踪为故障监视和分析提供诊断数据。您可以使用跟踪而不是调试器来了解应用程序的行为方式或故障原因。您还可以关联组件之间的故障和处理,以提供端到端体验,包括跨应用程序的所有组件的过程里程碑的跟踪,例如操作调用,代码异常,警告和其他重要的处理事件。
http://msdn.microsoft.com/en-us/library/ms733025(v=vs.110).aspx
答案 1 :(得分:1)
我在这里看到的唯一问题是方法GetIPv4Address()
及其返回的内容。通常最好的选择是使用localhost,主机名或0.0.0.0。